4

HttpBasicAuth を使用してユーザーを認証する API をフラスコで開発しました。API はフィドラーで完全に正常に動作し、間違った資格情報を渡すと 401 を返しますが、ログイン ページで同じものを使用すると、ブラウザーから余分なポップアップが表示されます。資格情報を要求するこの余分なポップアップを見たくありません (戻るときのブラウザーのデフォルトの動作)

401

WWW-Authenticate: Basic realm="Authentication Required"

)。

ローカルに展開した場合は正常に動作しますが、リモート サーバーにホストされている場合は動作しません。

ブラウザが資格情報を要求するポップアップを表示できないようにする 401 を実装するにはどうすればよいですか。

4

2 に答える 2

8

そのため、flask return ステートメントは実際には、データをクライアントに送信する前に再度処理されます。実際には、return ステートメントとして 2 つの要素のタプルを送信できます。2 番目の要素はステータス ( https://en.wikipedia.org/wiki/List_of_HTTP_status_codes ) です。認証ライブラリを使用している場合は、これを変更できます。

@auth.error_handler
def unauthorized():
    response = jsonify({'message':'Failed'})
    return response

これに:

@auth.error_handler
def unauthorized():
    response = jsonify({'message':'A winner is you'})
    return response, 404

ポップアップ メッセージが必要ない場合は、401 を別のものに変更します。

于 2016-03-19T16:59:28.600 に答える
3

これは、REST API とブラウザー クライアントを操作する際によくある問題です。残念ながら、ブラウザがポップアップを表示しないようにする明確な方法はありません。しかし、あなたができるトリックがあります:

  • 401 以外のステータス コードを返すことができます。たとえば、403 を返します。技術的には間違っていますが、クライアント側の API を制御できる場合は、それを機能させることができます。ブラウザは、401 を取得した場合にのみログイン ダイアログを表示します。

  • もう 1 つの少しクリーンなトリックは、応答に 401 を残し、応答にWWW-Authenticateヘッダーを含めないことです。これにより、ログイン ダイアログが表示されなくなります。

  • さらに別の方法 (私は自分で試したことはありませんが、他の場所で言及されているのを見ました) は、 401 と を残し、WWW-Authenticateauth メソッドを からBasicブラウザーに認識されない別のもの (つまり、 notBasicと not Digest) に変更することです。たとえば、それを作るCustomBasic

于 2015-07-28T03:22:14.623 に答える