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


99

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

私が試す:

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

私のサーバー構成応答は:

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クライアント(Chrome拡張)からAPIにアクセスできるため、サーバー構成は適切だと思います

助言がありますか?

PD:Advanced RESTクライアントから取得するヘッダーは次のとおりです。

    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 [REDACTED]
    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メソッドの送信


19
この投稿は長い間死んでいると思いますが、Authorization:ヘッダーを投稿することで、パスワードを平文で投稿したことに気付かない場合に備えて指摘しておきます。意味不明な文字列は、ユーザー名:パスワードのbase64エンコーディングだけなので、誰もがあなたのパスワードを見ることができます。うまくいけば、あなたはこれに気づき、ここでダミーのパスワードを使用しました:)
Lexelby

これは、ssrsレポートサーバー2017で正常に動作します。URLにパスワードとユーザー名が表示されません。
クラークヴェラ

@Lexelby:スペイン語では、ユーザー名は「ユーザー」、パスワードは「およびパスワード」です。したがって、これらは実際の資格情報ではないと思います。
pdr

回答:


48

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

http://user:passwd@www.server.com/index.html

詳細については、このURLを参照してください

URLと暗号化で渡されるHTTP基本認証資格情報

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

お役に立てれば...


6
このソリューションは、Androidのネイティブブラウザー(Pre KitKat)では機能しません。ユーザー名/ログインフォームは引き続きユーザーに表示されるので注意してください。
スターリングボーン

58
このメソッドは、ネットワークまたはデバイスでリッスンしているユーザーにユーザー名とパスワードを公開します...
Adam

5
@Adamハッシュ文字列も安全ではありません
Mustafa

38
これはまったく質問に答えません。URLとして渡すことはヘッダーではありません。
jemiloii、2015年

5
反対の理由:developer.mozilla.org/en-US/docs/Web/HTTP/Authentication。記事の終わりに向かって、それは言及していますThe use of these URLs is deprecated
anurupr

70

パーhttps://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decodinghttp://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))))
  }
});

1
注:IE6、7、8、9でこの機能を使用するには、Base64.jsなどのwindow.btoaポリフィルが必要です。また、unescapeはECMAScript v3に従って非推奨になりました。
null

あなたが間違っている@Techbrunch、seanp2kの例は非常にうまく機能し、それがASCIIにUnicode文字を解読することは非常に知られているトリックを使用して、それが実際に(UN)のエスケープがUnicodeをサポートしていないという事実を使用していますが、(12月)encodeURIComponentではありません...

40

NodeJSの答え:

NodeJSでそれを実行したい場合:Authorizationヘッダー付きのJSONエンドポイントにGETを実行し、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
});

1
ありがとう、あなたは私の日を保存しました:)
Sparw 2018

これは、「フェッチ」を使用した私の反応アプリケーションで機能してくれてありがとう
MohsenFM

13

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

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

例:

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

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

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

このsecurity.stackexchange.comの回答は、いくつかの欠点の概要をよく表しています。


3

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

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

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

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.