nginx + uWSGI + Python(Flask)で、動画ファイルをログインした人だけに配信しようとしています。
認証はPython側で行い、動画ファイルの送信はファイルサイズが大きいため、nginxのX-Accel-Redirect機能を使用しています。
認証にはFlask-Loginを使用しています。
解決したいこと
Android上のMicrosoft Edgeで接続すると、動画を再生できません。
具体的には以下のような挙動となります。
- 動画のURLに直接アクセス: 再生されず黒い画面のまま
- videoタグで埋め込み: 再生されず、以下のようなエラーメッセージが表示される
The media playback was aborted due to a corruption problem or because the media used features your browser did not support.
なお、以下の環境では、当問題は発生せず、動画が再生できます。
- Android上のGoogle Chrome
- WindowsやiOS上のMicrosoft Edge
- WindowsやiOS上のGoogle Chrome
Android上のMicrosoft Edgeでも再生できるようにするには、どうすればよいでしょうか?
コード
当該ファイルを送信する部分のコードを以下に示します。
python
1from mimetypes import guess_type 2from os.path import abspath、basename, getsize 3 4from flask import request, make_response 5 6@app.route('/auth_dist/<path:target_path>') 7@login_required 8def auth_dist(target_path: str): 9 print(request.headers) # クライアントのリクエストヘッダを確認(※) 10 return x_send_file(f'{LOCAL_ROOT}/{target_path}') 11 12def x_send_file(local_path): 13 response = make_response() 14 response.headers['Content-Description'] = 'File Transfer' 15 response.headers['Cache-Control'] = 'no-cache' 16 response.headers['Connection'] = 'keep-alive' 17 response.headers['Content-Disposition'] = f'inline; filename={basename(local_path)}' 18 response.headers['Content-Length'] = getsize(local_path) 19 response.headers['X-Accel-Redirect'] = get_url(local_path, prefix='/internal') 20 response.mimetype, _ = guess_type(local_path) 21 return response 22 23def get_url(path, *, prefix='', postfix=''): 24 replace_after = APP_ROOT_PATH + prefix 25 return re.sub('^'+LOCAL_ROOT, replace_after, abspath(path)) + postfix
調査してわかっていること
動画を上記コードの※部分で、動画ファイルをリクエストされた際のヘッダを確認したところ、
以下のような出力が得られました。
再生できないときは、この後、ログインページへリダイレクトするレスポンスが続きます。
(ページの取得に対するリダイレクトではないため、ブラウザでの見かけ上はログインページには遷移しません)
このことから、Microsoft Edgeでの動画リクエストの場合のみ、
ログイン状態が解除されてしまい、動画ファイルが配信されていないものと推測されます。
よく見ると、なぜかセッションIDが変わっていることがわかります。
# Androidでページを取得した場合のリクエストヘッダ(表示できる) Host: xxxxxxxxxxxxxxx Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/a png,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7 Cookie: /session=.eJwdj0FqA... # Androidでvideoタグを読み込んだ場合のリクエストヘッダ(再生できない) Host: xxxxxxxxxxxxxxx Accept-Encoding: identity;q=1, *;q=0 User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Chrome-Proxy: frfr Accept: */* Referer: xxxxxxxxxxxxxxx Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7 Range: bytes=0- Cookie: /session=.eJwdj0FqA... User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Cookie: /session=eyJfZnJlc2... Allow-Cross-Domain-Redirect: false Host: xxxxxxxxxxxxxxx Connection: Keep-Alive Accept-Encoding: gzip # Androidで動画ファイルのURLにアクセスした場合のリクエストヘッダ(再生できない) Host: xxxxxxxxxxxxxxx Accept-Encoding: identity;q=1, *;q=0 User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Chrome-Proxy: frfr Accept: */* Referer: xxxxxxxxxxxxxxx 175901.mp4 Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7 Range: bytes=0-925456 If-None-Match: "5dbaa25b-e1f11" If-Modified-Since: Thu, 31 Oct 2019 08:59:07 GMT Cookie: /session=.eJwdj0FqA... User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Allow-Cross-Domain-Redirect: false Host: xxxxxxxxxxxxxxx Connection: Keep-Alive Accept-Encoding: gzip Cookie: /session=eyJfZnJlc2...
一方、以下のダウンロードリンク経由で動画ファイルにアクセスした場合は、正しくダウンロードでき、ローカルに保存されたファイルは再生できます。
html
1<a role="button" name="dlVideoBtn" class="btn btn-primary float-right" href="/auth_dist/xxxx.mp4" download="xxxx.mp4">ダウンロード</a>
# Androidで動画ファイルのダウンロードリンクをクリックした場合のリクエストヘッダ(ダウンロードできる) Host: xxxxxxxxxxxxxxx User-Agent: Mozilla/5.0 (Linux; Android 6.0; BG2-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36 EdgA/42.0.2.3985 Accept-Encoding: gzip, deflate, br Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7 Cookie: /session=.eJwdj0FqA...
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/22 11:56