web-dev-qa-db-ja.com

ブラウザが基本認証ポップアップを呼び出し、Jqueryを使用して401エラーを処理するのを防ぐ方法は?

基本認証を使用して承認リクエストを送信する必要があります。 jqueryを使用してこれを正常に実装しました。ただし、401エラーが発生すると、基本認証ブラウザのポップアップが開き、jquery ajaxエラーコールバックが呼び出されません。

97
Alexey Zakharov

私も最近この問題に直面していました。 401basicまたはdigestauthentication)、これを修正する2つの方法があります:

  • 401を返さないようにサーバーの応答を変更します。代わりに200コードを返し、jQueryクライアントでこれを処理します。
  • 認証に使用しているメソッドをヘッダーのカスタム値に変更します。ブラウザには、BasicおよびDigestのポップアップが表示されます。クライアントとサーバーの両方でこれを変更する必要があります。

    headers : {
      "Authorization" : "BasicCustom"
    }
    

基本認証でjQueryを使用する例については、 this もご覧ください。

41
nwinkler

一般的な400ステータスコードを返し、そのクライアント側を処理します。

または、401を保持し、WWW-Authenticateヘッダーを返さないようにすることもできます。これは実際にブラウザーが認証ポップアップで応答しているものです。 WWW-Authenticateヘッダーがない場合、ブラウザは資格情報を要求しません。

31
Ibraheem

次のようなリクエストURLを使用して、基本認証ポップアップを抑制することができます。

https://username:[email protected]/admin/...

401エラー(間違ったユーザー名またはパスワード)を受け取った場合、jqueryエラーコールバックで正しく処理されます。いくつかのセキュリティ問題を引き起こす可能性があります(httpsではなくhttpプロトコルの場合)が、機能します。

PD:このソリューションサポートはChrome 59で削除されます

17
Ivan Samovar

他の人が指摘したように、ブラウザの動作を変更する唯一の方法は、応答に401ステータスコードが含まれていないか、含まれている場合はWWW-Authenticate: Basicヘッダーを含めないことです。ステータスコードの変更はあまり意味的ではなく望ましくないため、WWW-Authenticateヘッダーを削除することをお勧めします。 Webサーバーアプリケーションを変更できない場合、または変更したくない場合は、Apacheを使用してサービスを提供またはプロキシすることができます(Apacheをまだ使用していない場合)。

リクエストに含まれるWW [WOME-Authenticate]ヘッダーIFFを削除するために、Apacheがレスポンスを書き換える構成は、ヘッダーX-Requested-With: XMLHttpRequest(JQuery/AngularJSなどの主要なJavascriptフレームワークによってデフォルトで設定されます...)そして、応答にはヘッダーWWW-Authenticate: Basicが含まれます。

Apache 2.4でテスト済み(2.2で動作するかどうかは不明)。これは、インストールされるmod_headersモジュールに依存します。 (Debian/Ubuntuでは、Sudo a2enmod headersおよびApacheを再起動します)

    <Location />
            # Make sure that if it is an XHR request,
            # we don't send back basic authentication header.
            # This is to prevent the browser from displaying a basic auth login dialog.
            Header unset WWW-Authenticate "expr=req('X-Requested-With') == 'XMLHttpRequest' && resp('WWW-Authenticate') =~ /^Basic/"
    </Location>   
10
syastrov

IISサーバーを使用している場合は、IIS URL Rewriting(v2)をセットアップして、要求されたURLのWWW-AuthenticationヘッダーをNoneに書き換えることができます。

ここにガイド

変更する値はresponse_www_authenticateです。

さらに情報が必要な場合は、コメントを追加して、web.configファイルを投稿します。

5
Zymotik

X-Requested-With:XMLHttpRequestをリクエストヘッダーと共に使用します。したがって、応答ヘッダーにはWWW-Authenticate:Basicは含まれません。

beforeSend: function (xhr) {
                    xhr.setRequestHeader('Authorization', ("Basic "
                        .concat(btoa(key))));
                    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                },
3
sedhu

WWW-Authenticateヘッダーが削除された場合、認証情報のキャッシュを取得せず、リクエストでAuthorizationヘッダーを取得しません。つまり、生成する新しいリクエストごとに資格情報を入力する必要があります。

2
user2491441

または、サーバーの応答をカスタマイズできる場合は、403 Forbiddenを返すことができます。

ブラウザは認証ポップアップを開かず、jqueryコールバックが呼び出されます。

2
Javier Ferrero

Safariでは、同期リクエストを使用して、ブラウザがポップアップを表示しないようにすることができます。もちろん、同期リクエストはこの場合にのみユーザー資格情報を確認するために使用する必要があります...コンテンツ(送信または受信)が非常に重い場合、実際のリクエストを送信する前にそのようなリクエストを使用して、ユーザーエクスペリエンスを低下させる可能性があります。

    var xmlhttp=new XMLHttpRequest;
    xmlhttp.withCredentials=true;
    xmlhttp.open("POST",<YOUR UR>,false,username,password);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
1

Spring Bootの背面から、カスタムBasicAuthenticationEntryPointを使用しました。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().and().authorizeRequests()
            ...
            .antMatchers(PUBLIC_AUTH).permitAll()
            .and().httpBasic()
//    https://www.baeldung.com/spring-security-basic-authentication
            .authenticationEntryPoint(authBasicAuthenticationEntryPoint())
            ...

@Bean
public BasicAuthenticationEntryPoint authBasicAuthenticationEntryPoint() {
    return new BasicAuthenticationEntryPoint() {
        {
            setRealmName("pirsApp");
        }

        @Override
        public void commence
                (HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx)
                throws IOException, ServletException {
            if (request.getRequestURI().equals(PUBLIC_AUTH)) {
                response.sendError(HttpStatus.PRECONDITION_FAILED.value(), "Wrong credentials");
            } else {
                super.commence(request, response, authEx);
            }
        }
    };
}
0
GKislin

/ login urlを作成し、GETで「user」および「password」パラメーターを受け入れ、基本認証を必要としません。ここでは、php、node、Javaなどを使用してpasswdファイルを解析し、パラメーター(user/pass)を照合します。一致する場合は http:// user:[email protected]/ (ブラウザに資格情報を設定します)にリダイレクトします。そうでない場合は、401応答(WWW-Authenticateヘッダーなし)を送信します。

0
neiker