web-dev-qa-db-ja.com

基本認証用の正しい認証ヘッダーを送信する方法

APIからPOSTデータを取得しようとしていますが、基本認証を通過できません。

私が試してみます:

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic ZWx1c3VhcmlvOnlsYWNsYXZl');
  }
});

私のサーバー設定応答は次のとおりです。

response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"

私が取得するヘッダーは以下のとおりです。

ヘッダを要求する

OPTIONS /api/v1/token-auth/ HTTP/1.1
Host: theappurl.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
Access-Control-Request-Headers: Origin, authorization, content-type
Accept: */*
Referer: http://127.0.0.1:8080/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: es,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

レスポンスヘッダ

HTTP/1.1 401 Unauthorized
Server: nginx/1.1.19
Date: Fri, 16 Aug 2013 01:29:21 GMT
Content-Type: text/html
Content-Length: 597
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted"

Advanced REST Client からAPIにアクセスできるので、サーバー構成は良いと思います。 )(Chrome拡張機能)

助言がありますか?

PD:Advanced REST clientから取得したヘッダーは次のとおりです。

    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
    Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
    Authorization: Basic ZWx1c3VhcmlvOnlsYWNsYXZl
    Content-Type: application/x-www-form-urlencoded 
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: es,en;q=0.8
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

そして

    Server: nginx/1.1.19 
    Date: Fri, 16 Aug 2013 01:07:18 GMT 
    Content-Type: application/json; charset=utf-8 
    Transfer-Encoding: chunked 
    Connection: keep-alive
    Vary: Accept, Cookie 
    Allow: POST, OPTIONS 
    X-Robots-Tag: noindex

oPTIONメソッドを送信する

84
individuo7

URLの一部としてユーザーとパスワードを含めることができます。

http://user:[email protected]/index.html

詳しくはこのURLをご覧ください。

URLおよび暗号化で渡されたHTTP基本認証資格情報

もちろん、ユーザー名のパスワードが必要です。'Basic hashstringではありません。

お役に立てれば...

44
Dru

https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding および http://en.wikipedia]による。 org/wiki/Basic_access_authentication 、これはURLにユーザ名とパスワードを入れる代わりにヘッダを使って基本認証をする方法です。これはまだネットワークまたはこのJSコードへのアクセス権を持つ誰かからユーザー名またはパスワードを隠していないことに注意してください(例:ブラウザでそれを実行しているユーザー)。

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic ' + btoa(unescape(encodeURIComponent(YOUR_USERNAME + ':' + YOUR_PASSWORD))))
  }
});
63
seanp2k

NodeJSの答え:

NodeJSでそれをしたい場合は、Authorizationヘッダーを使ってGET to JSONエンドポイントを作成し、Promiseを取得します。

最初

npm install --save request request-promise

npm を参照)そして.jsファイルで:

var requestPromise = require('request-promise');

var user = 'user';
var password = 'password';

var base64encodedData = new Buffer(user + ':' + password).toString('base64');

requestPromise.get({
  uri: 'https://example.org/whatever',
  headers: {
    'Authorization': 'Basic ' + base64encodedData
  },
  json: true
})
.then(function ok(jsonData) {
  console.dir(jsonData);
})
.catch(function fail(error) {
  // handle error
});
29
jakub.g

ブラウザ環境にいる場合は、 btoa も使用できます。

btoaは文字列を引数として受け取り、Base64でエンコードされたASCII文字列を生成する関数です。それはブラウザの 97% によってサポートされています。

例:

> "Basic " + btoa("billy"+":"+"secretpassword")
< "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ="

その後、authorizationヘッダーにBasic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=を追加できます。

HTTP BASIC認証に関する通常の注意事項が適用されることに注意してください。最も重要なのは、トラフィックをhttpsで送信しない場合、盗聴されたユーザーがBase64エンコード文字列を単にデコードしてパスワードを取得できることです。

このsecurity.stackexchange.com の回答では、いくつかの欠点について概説しています。

5
fernandohur

uRLの一部としてユーザーとパスワードを使用する必要はありません

あなたはこれを試すことができます

byte[] encodedBytes = Base64.encodeBase64("user:passwd".getBytes());

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();
3
erhanck