正確にはOAuth 2.0ベアラートークンとは何ですか?


170

よるRFC6750 -The OAuth 2.0の承認フレームワーク:ベアラトークンの使用、ベアラトークンであります:

トークンを所持するすべての当事者(「所有者」)が、トークンを所持する他の当事者が使用できる方法でトークンを使用できるという特性を持つセキュリティトークン。

私にとって、この定義は曖昧で、仕様を見つけることができません。

  • 承認プロバイダーを実装しているとしましょう。無記名トークンに任意の文字列を指定できますか?
  • ランダムな文字列にすることはできますか?
  • 一部の属性のbase64エンコードである必要がありますか?
    ハッシュ化する必要がありますか?
  • また、サービスプロバイダーは、このトークンを検証するために承認プロバイダーにクエリを実行する必要がありますか?

ポインタをありがとうございます。


承認プロバイダーを実装しているとしましょう。無記名トークンに任意の種類の文字列を指定できますか?ランダムな文字列にできますか?アクセストークンは、Auth0のOAuth 2.0エンドポイントを介して発行されます:/ authorizeおよび/ oauth / token。OAuth 2.0互換のライブラリを使用して、アクセストークンを取得できます。優先OAuth 2.0ライブラリがまだない場合、Auth0は多くの言語とフレームワーク用のライブラリを提供します。
Bharathkumar V

回答:


146

ベアラートークン
トークンを所持するすべての当事者(「ベアラー」)が、トークンを所持する他の当事者が使用できる方法でトークンを使用できるという特性を持つセキュリティトークン。ベアラートークンを使用する場合、ベアラーは暗号鍵素材(所有証明)の所有を証明する必要はありません。

ベアラートークンは、認証サーバーによって作成されます。ユーザーがアプリケーション(クライアント)を認証すると、認証サーバーがトークンを生成して生成します。ベアラートークンは、OAuth 2.0で使用される主要なタイプのアクセストークンです。無記名トークンは基本的に「このトークンアクセスの無記名を与える」と言っています。

Bearer Tokenは通常、認証サーバーによって作成されるある種の不透明な値です。ランダムではありません。アクセスを許可するユーザーと、アプリケーションがアクセスするクライアントに基づいて作成されます。

たとえば、APIにアクセスするには、アクセストークンを使用する必要があります。アクセストークンは短命です(約1時間)。ベアラートークンを使用して、新しいアクセストークンを取得します。アクセストークンを取得するには、認証サーバーにこのベアラートークンとクライアントIDを送信します。このようにして、サーバーは、ベアラートークンを使用するアプリケーションが、ベアラートークンが作成されたアプリケーションと同じであることを認識します。例:アプリケーション用に作成されたベアラートークンを取得してアプリケーションで使用するだけでは、生成されていないため機能しません。

Google更新トークンは次のようになります:1 / mZ1edKKACtPAb7zGlwSzvs72PvhAbGmB8K1ZrGxpcNM

コメントからコピー:あなたが提供する無記名トークンに制限はないと思います。私が考えることができる唯一のことは、複数を許可することは素晴らしいことです。たとえば、ユーザーはアプリケーションを最大30回認証でき、古いベアラートークンは引き続き機能します。ああ、たとえば6か月間使用されていない場合は、システムから削除します。それらを生成して検証する必要があるのは認証サーバーであり、そのフォーマット方法はあなた次第です。

更新:

ベアラートークンは、すべてのインラインアクションHTTPリクエストのAuthorizationヘッダーに設定されます。例えば:

POST /rsvp?eventId=123 HTTP/1.1
Host: events-organizer.com
Authorization: Bearer AbCdEf123456
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/1.0 (KHTML, like Gecko; Gmail Actions)

rsvpStatus=YES

"AbCdEf123456"上記の例の文字列は、ベアラー認証トークンです。これは、認証サーバーによって生成された暗号トークンです。アクションとともに送信されるすべてのベアラートークンには、問題フィールドがあり、オーディエンスフィールドには、送信者ドメインをhttps://形式のURLとして指定します。たとえば、メールがnoreply@example.comからの場合、オーディエンスはhttps://example.comです。

ベアラートークンを使用している場合は、要求が認証サーバーから送信されたものであり、送信者ドメインを対象としていることを確認します。トークンが検証されない場合、サービスはHTTP応答コード401(無許可)で要求に応答する必要があります。

ベアラートークンはOAuth V2標準の一部であり、多くのAPIで広く採用されています。


2
@Xavier Egea Bearerトークンは、基本的には更新トークンであり、アクセストークンではありません。
Akhil Nambiar 2017

13
ベアラートークンは、更新トークン@AqeelSmith tools.ietf.org/html/rfc6750#section-6.1.1
Suman Kundu

9
最初の段落は、Bearerトークンが更新トークンであり、アクセストークンではないことを示しています。これはそうではありません。Bearerトークンの仕様から「この仕様では、OAuthアクセストークンがBearerトークンである場合に保護されたリソース要求を行う方法について説明しています。」 RFC6750
Daniel

8
答えを読んだ後、ベアラートークンと更新トークンも同じだと思いました。これを明確にするために、回答を更新する必要があります。
KurioZ7

2
この答えは非常に誤解を招くものです。この回答の最初のステートメントに記載されているように、ベアラートークンは更新トークンではありません。正してください。
think01 '11 / 10/19

67

私はあなたの質問を読んで、無記名トークンがどのように暗号化または署名されているかをインターネットで検索することに成功せずに試みました。ベアラートークンはハッシュされていないと思います(多分部分的ではあるが完全ではないかもしれません)。その場合、それを解読してそこからユーザーのプロパティを取得することができないからです。

しかし、あなたの質問はベアラートークン機能の答えを見つけようとしているようです:

承認プロバイダーを実装しているとしましょう。無記名トークンに任意の文字列を指定できますか?ランダムな文字列にすることはできますか?一部の属性のbase64エンコードである必要がありますか?ハッシュ化する必要がありますか?

そこで、ベアラートークンとリフレッシュトークンのしくみについて説明します。

ユーザーがSSLを介してトークンを送信するユーザーとパスワードをサーバーに要求すると、サーバーはアクセストークン更新トークンの 2つを返します

アクセストークンは、具象ユーザーとして認証されるすべてのリクエストヘッダーに追加する必要があるベアラートークンです。

Authorization: Bearer <access_token>

アクセストークンは、必要なすべてのユーザープロパティ、クレーム、および役割を含む暗号化された文字列です。(ロールまたはクレームをさらに追加すると、トークンのサイズが増加することを確認できます)。リソースサーバーは、アクセストークンを受信すると、それを復号化してこれらのユーザープロパティを読み取ることができます。このようにして、ユーザーはすべてのアプリケーションとともに検証および許可されます。

アクセストークンの有効期限は短い(つまり、30分)。アクセストークンの有効期限が長い場合、理論的には取り消すことができないため、問題になります。したがって、「User」に変わるrole = "Admin"を持つユーザーを想像してください。ユーザーがrole = "Admin"で古いトークンを保持している場合、管理者権限でトークンの有効期限が切れるまでアクセスできます。これが、アクセストークンの有効期限が短い理由です。

しかし、1つの問題が頭に浮かびます。アクセストークンの有効期限が短い場合、短い期間ごとにユーザーとパスワードを送信する必要があります。これは安全ですか?いいえ、そうではありません。避けるべきだ。これが、更新トークンがこの問題を解決するように見えるときです。

更新トークンはDBに保存され、有効期限が長くなります(例:1か月)。

ユーザーは、トークンの最初のリクエストで受け取った更新トークンを使用して、新しいアクセストークンを取得できます(有効期限が切れると、たとえば30分ごと)。アクセストークンの有効期限が切れると、クライアントは更新トークンを送信する必要があります。この更新トークンがDBに存在する場合、サーバーはクライアントに新しいアクセストークンと別の更新トークンを返します(古い更新トークンを新しい更新トークンに置き換えます)。

ユーザーアクセストークンが侵害された場合、そのユーザーの更新トークンをDBから削除する必要があります。この方法では、ハッカーが更新トークンを送信する新しいアクセストークンを取得しようとすると、このアクションが拒否されるため、トークンはアクセストークンの有効期限が切れるまでのみ有効です。


2
「認証サーバーがアクセストークンを受信すると、それを解読してこれらのユーザープロパティを読み取ることができるようになります。これにより、ユーザーはすべてのアプリケーションで検証され、許可されます。」認可サーバーは、アクセストークンを付与するサーバーではなく、それを受け取るものではありませんか?私はこの問題を頭に入れようとしています。多くの例では、承認サーバーとリソースサーバーを明確に区別しています。私が理解したのは、承認サーバーからアクセストークンを取得し、それをリソースサーバーへのすべての要求と一緒に渡すことです。
kivikall 2017年

1
@kivikallそうですね。答えを変更しました。リソースサーバーは、すべての要求でトークン(承認サーバーがトークン作成プロセスで暗号化したトークン)を受け取り、それを復号化します。
Xavier Egea 2017年

1
@kivikall実際には、トークンを復号化することは承認に関連するものでなければならないので、トークンは承認サーバーに属している必要があります。それが答えでそれを書いた理由です。しかし実際には、これはすべてのリクエストで、承認サーバーで受け取ったトークンを検証する必要があることを意味します(別のリクエストを実行している可能性があります)。したがって、パフォーマンスの低下を回避するには、トークンを復号化する機能の一部をリソースサーバーに付与することをお勧めします。:次のリンクをチェックstackoverflow.com/questions/12296017/...
ザビエルEgea

しかし、すべてのリクエストで、リソースサーバーは提供されたAccessTokenが承認サーバーに対して有効かどうかをチェックする必要があります。ロールが変更された場合、その変更は認証サーバーにすぐに反映されますよね?また、AccessTokenが侵害された場合に、RefreshTokenを削除するのはなぜですか?RefreshTokenはAccessTokenに基づいて計算できないため、期限が切れるとハッカーは再びブロックされます。
マンダリン

先ほど述べたように、アクセストークンにはロールなどのユーザー情報が含まれています。ユーザーロールが変更された場合、現在のトークンの有効期限が切れると、この変更が次のトークンに反映されます。これは、トークンがまだ有効であるため、短時間(アクセストークンの有効期限まで)にユーザーが同じロールを保持し、認証サーバーがそれを許可することを意味します。2番目の質問に関しては、更新トークンを削除すると、ユーザーは資格情報を再度挿入します。これは、アクセストークンが改ざんされている場合に必要です。他の場合では、refreshtokenの有効期限(例:1か月)までハッカーを承認できます
Xavier Egea

8

無記名トークンは、アルファベット、数字、「-」、「。」の1回以上の繰り返しです。、「_」、「〜」、「+」、「/」、それに続く0個以上の「=」。

RFC 6750 2.1。Authorization Request Header Field(形式はABNF(拡張BNF)です)

The syntax for Bearer credentials is as follows:

     b64token    = 1*( ALPHA / DIGIT /
                       "-" / "." / "_" / "~" / "+" / "/" ) *"="
     credentials = "Bearer" 1*SP b64token

これはBase64のように見えますが、ヘッダーのトークンはbase64でエンコードされている必要がありますか?、 そうではない。

「HTTP / 1.1、パート7:認証」**に少し深く掘り下げますが、b64tokenは、単にbase64、base64urlなどで使用される文字を許可するABNF構文定義であることがわかります。したがって、b64tokenはエンコードまたはデコードを定義しますが、アクセストークンを含むAuthorizationヘッダーの部分で使用できる文字を定義するだけです。

参考文献


ベアラートークンの目的をまったく説明していません。
Jaime Hablutzel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.