web-dev-qa-db-ja.com

なぜAuthorizationヘッダーをbase64でエンコードする必要があるのですか?

TwitterのAPIでは、APIシークレットキーと連結されたAPIキーのbase64エンコーディングであるAuthorizationヘッダーを送信する必要があります。ノードでは、次のものを使用します。

var base64 = new Buffer(apiKey + ':' + apiSecret).toString('base64');

送信されるヘッダーは次のようになります。

Authorization: 'Basic ' + base64

文字列「apiKeyHere:apiSecretHere」をエンコードするbase64のポイントは何ですか?生のAPI資格情報を含むAuthorizationヘッダーを受け入れないのはなぜですか?

この質問は base 64エンコーディングの目的とHTTP基本認証で使用される理由 に似ていますが、投票された回答では私の質問に完全には答えられません。 TwitterのAPIキーとAPIシークレットキーはすでにHTTP互換の文字です。それらは次のようになります(これらは本物ではありません):

コンシューマーキー(APIキー)8dme3utVQfOhlPk5BUG9XbFxR

コンシューマーシークレット(APIシークレット)QFZXoC7MP72JZtGMBNpjLGI4Vl1xr1q9dyPLp3u7jGtkESpbLm

では、なぜbase64でエンコードするのでしょうか。さらに、その投稿には、「エンコードの目的は、ユーザー名またはパスワードに含まれる可能性のあるHTTP互換ではない文字をHTTP互換の文字にエンコードすることです」と記載されています。ユーザー名とパスワードはすでにHTTP互換の文字ではないでしょうか?

9
skaterdav85

W3のドキュメントでは見つかりませんが、コンテンツの内容に関係なく、Authorizationヘッダーの資格情報をbase64にエンコードするのは単なるプロトコルだと思います。 Twitterの場合、あなたが言ったようにそれはあまり違いはありませんが、他の場合には、資格情報にこれらの文字を含めることができます。均一に保ち、エンコードするかどうかの間違いを防ぐために、すべての資格情報をエンコードする必要があります。

もう1つの理由は、ブラウザーも同じ方法で資格情報をエンコードすることです。 Twitterもおそらくそれを受け入れたいと思うでしょう。

6
Ivar

基本認証スキームは RFC7617 (および古い RFC2617 )で説明されています。

これは、パスワード資格情報をサーバーに送信するための標準的な方法です。 base64エンコードは、HTTP以外の文字とマルチバイト文字列を送信できるように資格情報をエンコードするために使用されます。

3

デフォルトでは、Hypertext Transfer Protocol (HTTP)メッセージのメッセージヘッダーフィールドパラメータは、ISO- 8859-1文字セット外の文字を運ぶことはできません。

ユーザー名とパスワードに互換性のない文字セットが含まれている場合、HTTPはそれらのテキストを運ぶことができません。これを防ぐために、ユーザー名とパスワードをbase64でエンコードして、HTTP互換の文字を[〜#〜] http [〜#〜]。詳細については、これを参照してください Basic_access_authentication

1
Varun

文字列は、セキュリティのためではなく、HTTP互換ではない文字を、ユーザー名またはパスワードに含まれる可能性のあるHTTP互換文字にエンコードするためにbase64でエンコードする必要があります。

0
Akshay