jQueryとAjaxで基本認証を使用する


419

ブラウザを使用して基本認証を作成しようとしていますが、実際にはアクセスできません。

このスクリプトがここにない場合は、ブラウザー認証が引き継ぎますが、ユーザーに認証を実行しようとしていることをブラウザーに通知します。

アドレスは次のようになります。

http://username:password@server.in.local/

私はフォームを持っています:

<form name="cookieform" id="login" method="post">
      <input type="text" name="username" id="username" class="text"/>
      <input type="password" name="password" id="password" class="text"/>
      <input type="submit" name="sub" value="Submit" class="page"/>
</form>

そしてスクリプト:

var username = $("input#username").val();
var password = $("input#password").val();

function make_base_auth(user, password) {
  var tok = user + ':' + password;
  var hash = Base64.encode(tok);
  return "Basic " + hash;
}
$.ajax
  ({
    type: "GET",
    url: "index1.php",
    dataType: 'json',
    async: false,
    data: '{"username": "' + username + '", "password" : "' + password + '"}',
    success: function (){
    alert('Thanks for your comment!');
    }
});

6
では、ブラウザに基本認証を処理さたくないのですか?なぜフォームベース認証を使用しないのですか?
no.good.at.coding

あなたが( -私がしようとしている何である認証の背後にあるサードパーティのAPIと統合する必要がある場合は、@ no.good.at.coding developer.zendesk.com/rest_api/docs/core/...
ブライアン・ハネー

回答:


467

jQueryのbeforeSendコールバックを使用して、認証情報を含むHTTPヘッダーを追加します。

beforeSend: function (xhr) {
    xhr.setRequestHeader ("Authorization", "Basic " + btoa(username + ":" + password));
},

6
私はあなたが与えた例を使用していますが、 `$ .ajax({url:" server.in.local / index.php "、beforeSend:function(xhr){xhr.setRequestHeader(“ Authorization”、“ Basic ” + encodeBase64(“ username:password”));}、成功:function(val){// alert(val); alert( "Thanks for your comment!");}}); `
Patrioticcow

69
beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); };私のために働く
Rico Suter 2013

12
問題...渡した認証情報が失敗した場合、Chromeではユーザー名とパスワードを再度入力するためのダイアログが表示されます。資格情報が失敗した場合に、この2番目のダイアログが表示されないようにするにはどうすればよいですか?
David

2
これは誰もが見られるようにユーザー名とパスワードを公開したままにしませんか?base64であっても、デコードすることができます。以下の答えと同じです。
cbron 14

6
@calebB基本認証は、一般に、ユーザー名とパスワードを誰にでも公開するだけです。これは、ここで説明する方法の問題だけではありません。基本認証、または実際に任意の認証が使用されている場合は、SSLも使用する必要があります。
Jason Jackson

354

1年でどのように変化するか。の代わりにヘッダー属性に加えてxhr.setRequestHeader、現在のjQuery(1.7.2+)には、$.ajax呼び出しにユーザー名とパスワード属性が含まれています。

$.ajax
({
  type: "GET",
  url: "index1.php",
  dataType: 'json',
  username: username,
  password: password,
  data: '{ "comment" }',
  success: function (){
    alert('Thanks for your comment!'); 
  }
});

コメントおよびその他の回答から編集:明確にするために- (1.7より前)の401 Unauthorized代わりに、応答なしで事前に認証を送信するには、次をsetRequestHeader使用します'headers'

$.ajax
({
  type: "GET",
  url: "index1.php",
  dataType: 'json',
  headers: {
    "Authorization": "Basic " + btoa(USERNAME + ":" + PASSWORD)
  },
  data: '{ "comment" }',
  success: function (){
    alert('Thanks for your comment!'); 
  }
});

15
それはそうではusernameありませんuserか?また、まったく同じではありません。オンラインのdocosと私の経験から、一部のAPIが必要とするため、プリエンプティブではないようです。つまりAuthorization、コード401が返された場合にのみヘッダーを送信します。
Stefano Fratini、2012年

3
@StefanoFratini-あなたは両方の点で正しいです。ユーザー名フィールドを修正しました。プリエンプティブ認証とチャレンジ時にのみ応答することについて知っておくとよいでしょう。他の回答のように明示的にヘッダーを設定すると、この「パッシブ」なバリアントの基本認証を使用できるようになります。
jmanning2k 2013年

私の上のオプションのdidntの仕事、これは魅力のように働いた...感謝のために
アヌープアイザック

上記のコメントを参照してください。正しい回答として{"Authorization": "Basic" + btoa( "user:pass")}を示すようにこの回答を修正してください
Jay

2
これが私が探していた答えです!私にとってこの回答で重要なのは、「ヘッダー」を使用して認証を事前に送信する方法です。ここで私の質問はこれで答えられます。stackoverflow.com/questions/28404452/…–
スティーブンアンダーソン、

63

beforeSendコールバックを使用して、次のような認証情報を含むHTTPヘッダーを追加します。

var username = $("input#username").val();
var password = $("input#password").val();  

function make_base_auth(user, password) {
  var tok = user + ':' + password;
  var hash = btoa(tok);
  return "Basic " + hash;
}
$.ajax
  ({
    type: "GET",
    url: "index1.php",
    dataType: 'json',
    async: false,
    data: '{}',
    beforeSend: function (xhr){ 
        xhr.setRequestHeader('Authorization', make_base_auth(username, password)); 
    },
    success: function (){
        alert('Thanks for your comment!'); 
    }
});

4
ここでBase64暗号化に使用されている「btoa」は、10未満のIEバージョンと一部のモバイルプラットフォームではサポートされていないことに注意してください
SET

1
また、このdeveloper.mozilla.org/en-US/docs/DOM/window.btoaによると、btoa(unescape(encodeURIComponent(str)))を使用する必要があります
SET

@SET、私はそれがbtoa(encodeURIComponent(escape(str)))である必要があると思います
Saurabh Kumar 14

応答を取得したかったので非同期falseを取り除き、結果関数を成功関数に追加しました。事前に生成されたAuthorizationヘッダーもあるので、代わりにそれを使用しました。
radtek、2014

1
@SETは、Base64が暗号化されておらず、エンコードされていることに注意してください。それが暗号化されている場合、単一の関数呼び出しでそれをデコードすることは非常に簡単ではありません
Chris

40

または、単に1.5で導入されたheadersプロパティを使用します。

headers: {"Authorization": "Basic xxxx"}

リファレンス:jQuery Ajax API


各ユーザーに対してそれを行う方法を教えていただけますか?つまり、データベースから各ユーザーのAPIトークンを取得し、それをajaxヘッダーで送信します。
Haniye Shadman

32

上記の例は少し混乱しますが、これがおそらく最良の方法です。

$.ajaxSetup({
  headers: {
    'Authorization': "Basic " + btoa(USERNAME + ":" + PASSWORD)
  }
});

上記は、リコとヨッシの答えの組み合わせから取られました。

btoaの機能Base64では、文字列をエンコードします。


5
URLに関係なく、すべての AJAXリクエストでログイン情報を送信するため、これは悪い考えです。また、のドキュメントに$.ajaxSetup()は、「将来のAjaxリクエストのデフォルト値を設定します。その使用はお勧めしません。
Zero3

27

他の人が示唆しているように、Ajax呼び出しでユーザー名とパスワードを直接設定できます。

$.ajax({
  username: username,
  password: password,
  // ... other parameters.
});

または、クレデンシャルをプレーンテキストで保存しない場合は、headersプロパティを使用します。

$.ajax({
  headers: {"Authorization": "Basic xxxx"},
  // ... other parameters.
});

どちらの方法で送信しても、サーバーは非常に丁寧でなければなりません。Apacheの場合、.htaccessファイルは次のようになります。

<LimitExcept OPTIONS>
    AuthUserFile /path/to/.htpasswd
    AuthType Basic
    AuthName "Whatever"
    Require valid-user
</LimitExcept>

Header always set Access-Control-Allow-Headers Authorization
Header always set Access-Control-Allow-Credentials true

SetEnvIf Origin "^(.*?)$" origin_is=$0
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is

説明:

一部のクロスドメインリクエストでは、ブラウザは認証ヘッダーが欠落しているプリフライトOPTIONSリクエストを送信します。認証ディレクティブをLimitExceptタグ内にラップして、プリフライトに適切に応答します。

次に、いくつかのヘッダーを送信して、認証が許可されていることをブラウザーに通知し、 Access-Control-Allow-Originを使用して、クロスサイト要求のアクセス許可を付与します。

*ワイルドカードが Access-Control-Allow-Originの値として機能しない場合があります。呼び出し先の正確なドメインを返す必要があります。この値を取得するには、SetEnvIfを使用します。


5
ブラウザが認証ヘッダーなしでCORSプリフライトリクエストを送信するという情報に感謝します!このような詳細は、何時間ものデバッグを引き起こす可能性があります!
jbandi 14

23

すべてのajaxリクエストのデフォルト値を設定できるjQuery ajaxSetup関数を使用します。

$.ajaxSetup({
  headers: {
    'Authorization': "Basic XXXXX"
  }
});

11

JSONPは基本認証では機能しないため、jQuery beforeSendコールバックはJSONP / Scriptでは機能しません。

ユーザーとパスワードをリクエストに追加することで、この制限を回避することができました(例:user:pw@domain.tld)。これはInternet Explorerを除くほとんどすべてのブラウザーで動作しますは、URLによる認証がサポートされていないします(呼び出しは実行されません)。

http://support.microsoft.com/kb/834489を参照してください


セキュリティに関しては、これを許可しないのは賢明な選択だと思います
ジョージビルビリス

リンクが壊れています(404)。
Peter Mortensen 2018年

10

これを実現するには、以下に示す3つの方法があります。

方法1:

var uName="abc";
var passwrd="pqr";

$.ajax({
    type: '{GET/POST}',
    url: '{urlpath}',
    headers: {
        "Authorization": "Basic " + btoa(uName+":"+passwrd);
    },
    success : function(data) {
      //Success block  
    },
   error: function (xhr,ajaxOptions,throwError){
    //Error block 
  },
});

方法2:

var uName="abc";
var passwrd="pqr";

$.ajax({
    type: '{GET/POST}',
    url: '{urlpath}',
     beforeSend: function (xhr){ 
        xhr.setRequestHeader('Authorization', "Basic " + btoa(uName+":"+passwrd)); 
    },
    success : function(data) {
      //Success block 
   },
   error: function (xhr,ajaxOptions,throwError){
    //Error block 
  },
});

方法3:

var uName="abc";
var passwrd="pqr";

$.ajax({
    type: '{GET/POST}',
    url: '{urlpath}',
    username:uName,
    password:passwrd, 
    success : function(data) {
    //Success block  
   },
    error: function (xhr,ajaxOptions,throwError){
    //Error block 
  },
});

8

SharkAlleyの回答によると、nginxでも動作します。

私はnginxの背後にあるサーバーからjQueryによってデータを取得し、Base Authによって制限されるソリューションを探していました。これは私にとってはうまくいきます:

server {
    server_name example.com;

    location / {
        if ($request_method = OPTIONS ) {
            add_header Access-Control-Allow-Origin "*";
            add_header Access-Control-Allow-Methods "GET, OPTIONS";
            add_header Access-Control-Allow-Headers "Authorization";

            # Not necessary
            #            add_header Access-Control-Allow-Credentials "true";
            #            add_header Content-Length 0;
            #            add_header Content-Type text/plain;

            return 200;
        }

        auth_basic "Restricted";
        auth_basic_user_file /var/.htpasswd;

        proxy_pass http://127.0.0.1:8100;
    }
}

そして、JavaScriptコードは次のとおりです。

var auth = btoa('username:password');
$.ajax({
    type: 'GET',
    url: 'http://example.com',
    headers: {
        "Authorization": "Basic " + auth
    },
    success : function(data) {
    },
});

私が役立つと思う記事:

  1. このトピックの回答
  2. http://enable-cors.org/server_nginx.html
  3. http://blog.rogeriopvl.com/archives/nginx-and-the-http-options-method/
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.