web-dev-qa-db-ja.com

複数のHTTP Authorizationヘッダー?

HTTPメッセージに複数の認証ヘッダーを含めることはできますか?具体的には、Bearerトークンタイプ(OAuthアクセストークンを渡す)とBasicタイプ(base64エンコードされたユーザー名:パスワードを渡す)のいずれかを含めたいと思います。

GET /presence/alice HTTP/1.1 
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM
Authorization: Basic YXNkZnNhZGZzYWRmOlZLdDVOMVhk

これが不可能な理由はないと思いますが、コミュニティに確認して確認したかっただけです。

47
lewiada

これは可能であるはずです、フィールド値の間にコンマを追加するだけです、例えば:

GET /presence/alice HTTP/1.1 
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM, Basic YXNkZnNhZGZzYWRmOlZLdDVOMVhk

これは RFC72 、セクション3.2.2、フィールド順序で定義されています:

送信者は、そのヘッダーフィールドのフィールド値全体がコンマ区切りリストとして定義されていない場合(つまり、#(values)]またはヘッダーフィールドがwell-既知の例外(下記のとおり)。

受信者は、メッセージのセマンティクスを変更せずに、同じフィールド名を持つ複数のヘッダーフィールドを1つの「フィールド名:フィールド値」のペアに結合し、後続の各フィールド値を結合フィールド値に順番に追加して、コンマ。したがって、同じフィールド名を持つヘッダーフィールドが受信される順序は、結合されたフィールド値の解釈にとって重要です。プロキシは、メッセージを転送するときにこれらのフィールド値の順序を変更してはなりません。

すべてのWebサーバーがこれを受け入れるかどうかはわかりません。この記事を書いている時点では、それが機能するかどうかについて同僚との議論の最中です。

35
Sam Critchley

いいえ、できません。 http://greenbytes.de/tech/webdav/rfc7235.html#header.authorization の構文定義を参照してください

20
Julian Reschke

同様の質問がありました。これは非常に一般的な問題のようです( 質問へのリンク )。最終的に、ベアラートークンの認証ヘッダーを次のような非標準のものに変更しました。

X-Auth:ベアラーmF_9.B5f-4.1JqM

このように、これは単なる別のHTTPヘッダーであり、基本的なhttp認証が渡されます。独自のAPIを開発している場合、これは問題ないはずです。

いくつかのさらなる研究

RFC 2617 に基づいて、興味深い詳細をいくつか示します。

ユーザーエージェントは、理解している最も強力なauth-schemeを持つチャレンジの1つを使用し、そのチャレンジに基づいてユーザーに資格情報を要求することを選択しなければなりません。

多くのブラウザはBasicのみを認識し、それが最初に提示されるauth-schemeである必要があることに注意してください。サーバーには、最低限必要な場合にのみBasicを含める必要があります。

10
Azngeek

複数の認証ヘッダーを持つことは可能ですが、複数の認証を受け入れるAPIの統合中に同じ問題が発生しました。

React jsは、複数の認証トークンを受け入れるAPIを呼び出す例です。

axios.get(Constants.API+Constants.GET_USER,  {  headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
"Authorization": Constants.AUTH_Element + ',' + Constants.AUTH_ORG + ','+ 
Constants.AUTH_USER
}})
.then(function (response) {
    // handle success
    console.log(response);
})
.catch(function (error) {
    // handle error
    console.log(error);
})
.finally(function () {
    // always executed
});
0
Sravani