web-dev-qa-db-ja.com

flask)でHTTP認証を使用する場合の標準401応答

フラスコでは、次の スニペット を使用してHTTP認証を有効にしています。

def authenticate():
    return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm="Login Required"'})

さて、Flaskでの私の過去の経験では、誰かの資格情報が正しくなく、私がただ電話できることを彼らに知らせたい場合:

abort(401)

これにより、基本的なApache401応答が得られます。上記のスニペットでそれを実装する方法を知っている人はいますか?

ありがとう

21
ingh.am

Flaskでは、カスタムエラー応答は非常に簡単です。引数がHTTPエラーステータスコードのみである関数を作成し、flask.Responseインスタンスを返すようにして、 @ app.errorhandler で装飾します。

_@app.errorhandler(401)
def custom_401(error):
    return Response('<Why access is denied string goes here...>', 401, {'WWW-Authenticate':'Basic realm="Login Required"'})
_

その後、abort(401)を心ゆくまで使用できます。

30
ʇsәɹoɈ

FlaskのabortはWerkzeugから直接来ています。これは呼び出し可能なオブジェクトであり、オンデマンドでさまざまな事前定義されたHTTP例外(HTTPExceptionのサブクラス)を発生させます。詳細については、コード ここ を確認してください。

事前定義されたUnauthorized(401にマップされます)は、コードとメッセージのみを定義し、ブラウザでログインポップアップをトリガーするために必要な_WWW-Authenticate_ヘッダーは定義しません。 HTTPExceptionのヘッダーは、_HTTPException.get_headers_の[('Content-Type', 'text/html')]としてハードコードされています。

したがって、_WWW-Authenticate_ヘッダーを追加するには、独自のUnauthorizedサブクラスを作成し、_get_headers_関数を上書きして、最後に_abort.mapping_ディクショナリを更新します。

_from flask import abort
from werkzeug.exceptions import Unauthorized

class MyUnauthorized(Unauthorized):
    description = '<Why access is denied string goes here...>'
    def get_headers(self, environ):
        """Get a list of headers."""
        return [('Content-Type', 'text/html'),
            ('WWW-Authenticate', 'Basic realm="Login required"')]

abort.mapping.update({401: MyUnauthorized})
_

これで、すべてのabort(401)呼び出しでカスタム例外が発生します。

13
Florian