AuthorizationHTTPヘッダーをカスタマイズします


81

クライアントがAPIにリクエストを送信するときに、クライアントを認証する必要があります。クライアントにはAPIトークンがあり、標準Authorizationヘッダーを使用してトークンをサーバーに送信することを考えていました。

通常、このヘッダをするために使用されるBasicDigest、認証。しかし、このヘッダーの値をカスタマイズして、カスタムauth-schemeを使用できるかどうかはわかりません。例:

Authorization: Token 1af538baa9045a84c0e889f672baf83ff24

これをお勧めしますか?または、トークンを送信するためのより良いアプローチはありますか?

回答:


51

Authorization:ヘッダーを使用する独自のカスタム認証スキーマを作成できます。たとえば、これがOAuthの仕組みです。

原則として、サーバーまたはプロキシが標準ヘッダーのを理解しない場合、それらはそのままにして無視します。多くの場合、予期しない結果を引き起こす可能性のある独自のヘッダーキーを作成しています。多くのプロキシは、認識できない名前のヘッダーを削除します。

そうは言っても、Authorization:Cookieがカスタム値を運ぶように明示的に設計されているという単純な理由から、ヘッダーではなくCookieを使用してトークンを送信する方がおそらく良い考えですが、HTTPの組み込み認証メソッドの仕様では実際にはいずれにせよ、それが何を言っているのかを正確に知りたい場合は、こちらをご覧ください

これに関するもう1つのポイントは、多くのHTTPクライアントライブラリにはダイジェストと基本認証のサポートが組み込まれていますが、ヘッダーフィールドに生の値を設定しようとすると、作業が難しくなる可能性がありますが、それらはすべてCookieを簡単にサポートします。それらの中に多かれ少なかれ任意の値を許可します。


9
それがOAuthの仕組みだと聞いてうれしいです。Cookieを使用すると、クライアントの実装が簡単になるかどうかはわかりません。クライアントがブラウザでない限り、Cookieを操作するためのルール(パス、有効期限など)は、ヘッダーフィールドを設定することを覚えているだけでなく、クライアントに実装するのが複雑です。ほとんどのクライアントライブラリでは、正しいヘッダーを簡単に設定できます。
トーマスワトソン

2
@ThomasWatsonは、Cookieスコープの点についてあなたと意見を異にすることはできませんが、ここではそれほど重要ではありません。(Authorization:ヘッダーを使用した)HTTP認証の範囲はドメインごとです。つまり、Cookieのドメインを「このドメイン」に設定し、パスを「/」に設定すると、HTTP認証のスコープと同じスコープになります。ただし、実際にはあなた次第ですが、Julian Reschkeが指摘しfeel that you have something of generic useているように、別のアプリケーションで使用できるものでない限り、新しい認証スキームを定義するべきではありません。
DaveRandom 2011

8

CROSS ORIGINリクエストの場合は、以下をお読みください。

私はこの状況に直面し、最初はAuthorizationヘッダーを使用することを選択し、次の問題に直面した後、ヘッダーを削除しました。

Authorizationヘッダーはカスタムヘッダーと見なされます。したがって、Autorizationヘッダーセットを使用してクロスドメインリクエストが行われると、ブラウザは最初にプリフライトリクエストを送信します。プリフライトリクエストはOPTIONSメソッドによるHTTPリクエストであり、このリクエストはリクエストからすべてのパラメータを取り除きます。サーバーAccess-Control-Allow-Headersは、カスタムヘッダー(Authorizationヘッダー)の値を持つヘッダーで応答する必要があります。

そのため、クライアント(ブラウザー)が送信するリクエストごとに、追加のHTTPリクエスト(OPTIONS)がブラウザーによって送信されていました。これにより、APIのパフォーマンスが低下しました。これを追加するとパフォーマンスが低下するかどうかを確認する必要があります。回避策として、httpパラメーターでトークンを送信しています。これは最善の方法ではないことがわかっていますが、パフォーマンスを犠牲にすることはできませんでした。


また、httpparamsでsessionIDを送信することも検討しています。なぜこれが最善の方法ではないと言うのですか?ファイアウォールがヘッダーを削除することに対して、またクロスオリジンのパフォーマンスの低下に対して堅牢であるという利点があるようです。その欠点は何ですか?
2016

1
欠点は、GETリクエストの場合のみです。Authorization tokenアプリケーションの(機密データ)を使用してユーザーを認証する必要がありました。同じ理由で、GETで機密データを送信しないでください。また、paramsで認証トークンを使用しないでください。w3 w3.org/Protocols/rfc2616/rfc2616-sec15.html#sec15.1.3によると、「HTTPプロトコルは機密データの送信にGETベースのフォームを使用すべきではありません」。
Abhishek Kumar

ヘッダーが気に入らない場合は、トークンをCookieに保存できます。(トークンをセッションIDと混同しないでください)。PUTとDELETEによって、とにかくオプションが送信されることに注意してください...ほとんどの場合、サーバー側のRESTクライアントを使用し、ブラウザーは非常に優れたRESTクライアントとは見なされないことに注意してください。
inf3rno 2017

5

これは少し時代遅れですが、同じ質問への答えを探している他の人がいるかもしれません。APIにとってどの保護スペースが意味をなすかを考える必要があります。たとえば、APIへのクライアントアプリケーションアクセスを識別および認証して、APIの使用を既知の登録済みクライアントアプリケーションに制限したい場合があります。この場合、あなたは使用することができますBasicクライアントIDをユーザーID、クライアント共有シークレットをパスワードとする認証方式。独自の認証スキームは必要ありません。保護スペースごとにクライアントが使用する認証スキームを明確に識別するだけです。私は保護スペースごとに1つだけを好みますが、HTTP標準では、各WWW-Authenticateヘッダー応答で複数の認証スキームと各応答で複数のWWW-Authenticateヘッダーの両方が許可されています。これは、どのオプションを使用するかをAPIクライアントにとって混乱させるでしょう。一貫性があり明確であると、APIが使用されます。


2

カスタムスキーム名でHTTP認証を使用しないことをお勧めします。ただし、一般的な用途があると感じた場合は、新しいスキームを定義できます。詳細については、http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p7-auth-latest.html#rfc.section.2.3を参照してください。


リンク先のドキュメントはHTTP / 1.1のドラフトです。私は最終的な標準を調べようとしてきましたが、カスタムスキームを登録する必要があることについて何も見つかりません。これは、起草プロセス中に、デフォルトのスキームを見つけて同意したかったというだけではありませんか?
トーマスワトソン

トーマス、私が参照したドキュメントは、RFC 2616/7のリビジョンです(スキームのレジストリがありませんでした)。進行中ですが、完成に近づいています。
ジュリアンレシュケ2011

0

郵便配達員で以下を試してください:-

ヘッダーセクションの例では、私のために働いています。

承認:JWTeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9。eyIkX18iOnsic3RyaWN0TW9kZSI6dHJ1ZSwiZ2V0dGVycyI6e30sIndhc1BvcHVsYXRlZCI6ZmFsc2UsImFjdGl2ZVBhdGhzIjp7InBhdGhzIjp7InBhc3N3b3JkIjoiaW5pdCIsImVtYWlsIjoiaW5pdCIsIl9fdiI6ImluaXQiLCJfaWQiOiJpbml0In0sInN0YXRlcyI6eyJpZ25vcmUiOnt9LCJkZWZhdWx0Ijp7fSwiaW5pdCI6eyJfX3YiOnRydWUsInBhc3N3b3JkIjp0cnVlLCJlbWFpbCI6dHJ1ZSwiX2lkIjp0cnVlfSwibW9kaWZ5Ijp7fSwicmVxdWlyZSI6e319LCJzdGF0ZU5hbWVzIjpbInJlcXVpcmUiLCJtb2RpZnkiLCJpbml0IiwiZGVmYXVsdCIsImlnbm9yZSJdfSwiZW1pdHRlciI6eyJkb21haW4iOm51bGwsIl9ldmVudHMiOnt9LCJfZXZlbnRzQ291bnQiOjAsIl9tYXhMaXN0ZW5lcnMiOjB9fSwiaXNOZXciOmZhbHNlLCJfZG9jIjp7Il9fdiI6MCwicGFzc3dvcmQiOiIkMmEkMTAkdTAybWNnWHFjWVQvdE41MlkzZ2l3dVROd3ZMWW9ZTlFXejlUcThyaDIwR09IMlhHY3haZWUiLCJlbWFpbCI6Im1hZGFuLmRhbGUxQGdtYWlsLmNvbSIsIl9pZCI6IjU5MjEzYzYyYWM2ODZlMGMyNzI2MjgzMiJ9LCJfcHJlcyI6eyIkX19vcmlnaW5hbF9zYXZlIjpbbnVsbCxudWxsLG51bGxdLCIkX19vcmlnaW5hbF92YWxpZGF0ZSI6W251bGxdLCIkX19vcmlnaW5hbF9yZW1vdmUiOltudWxsXX0sIl9wb3N0cyI6eyIkX19vcmlnaW5hbF9zYXZlIjpbXSwiJF9fb3JpZ2luYWxfdmFsaWRhdGUiOltdLCIkX19vcmlnaW5hbF9yZW1vdmUiOltdfSwiaWF0IjoxNDk1MzUwNzA5LCJleHAiOjE0OTUzNjA3ODl9.BkyB0LjKB4FIsCtnM5FcpcBLvKed_j7rCCxZddwiYnU


1
本当にJWTでパスワード/ハッシュを送信していますか?シンプルなbase64です。
ザハール2017年

1
@Zakhar:SPAの非常に一般的な方法は、ユーザーセッション全体をJWT内にカプセル化して(完全なjsonドキュメントであるため)、サーバー側のセッションストレージの必要性を排除することです。
カウバート2017

@cowbert:JWTである種のセッショントークン以外のものをカプセル化するのが一般的かどうかはわかりません(たとえば、この投稿を参照してください)。
アレクサンダーアバクモフ2017

@AlexanderAbakumov誤解を招くような記事でいっぱいの彼は、いくつかのポイントを獲得しましたが、彼のポイントの多くは意味がなく、理由もなく反対しているものもあります。彼はクッキーが大好きで、からいくつかを取得する必要があると思います。ベーカリーと彼の記事を修正しました。Cookieを使用して作業日数を浪費する状況がたくさんありました。localStorageを使用したJWTにより、頭痛と時間が大幅に節約されました。わずか2時間の作業と手間で、二度とアクセスすることはありません。彼がモバイルアプリを開発したり、セキュリティルールが厳しく制限されたブラウザを試したりしたことはないだろうか。
アル・Mothafar

アル・Mothafar @:あなたはあなたのような文に展開する場合、私は感謝しthat article full of misleadingsa lot of his points does not make sense何らかの方法で、など(意味、それはここでは、おそらくコメントを越えた何か)。多分あなたは答えやブログ投稿を書くことができますか?議論を比較することは本当に興味深いでしょう。
アレクサンダーアバク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.