リソースサーバーのOAuth 2.0アクセストークンを検証する方法


147

クライアントがOAuth 2.0アクセストークンで保護されたリソースを取得するようにリソースサーバーに要求した場合、このサーバーはどのようにトークンを検証しますか?OAuth 2.0更新トークンプロトコル?


サーバーは、それ自体が以前に発行したトークンを検証できるはずです...通常、これはデータベース検索または暗号化(自己署名トークン)です。
Thilo、2012

そうですか。この場合、リソース所有者WSとクライアントWSは両方とも異なるデバイス上にありますか?
2012

5
認証サービスとリソースサービスのことですか?(クライアント/コンシューマーは常に別のデバイス上にあり、トークンを自分で検証することはできません)その場合、「高価」な更新トークンを使用して確認することができます(認証サーバーのみが実行できます)。頻繁に期限切れになり、オフラインで確認できるアクセストークン。
Thilo、2012

回答:


97

2015年11月更新:以下のHans Z.による-これは実際にRFC 7662の一部として現在定義されています

元の回答: OAuth 2.0仕様(RFC 6749)では、アクセストークン(AT)検証のためのリソースサーバー(RS)と承認サーバー(AS)間の相互作用を明確に定義していません。それは実際にはASのトークン形式/戦略に依存します-一部のトークンは自己完結型(JSON Web Tokenのように)ですが、他のトークンはASでサーバー側に保持された情報を参照するだけでセッションCookieに似ています。

AT検証のためにRSがASと通信するための標準的な方法を作成することについて、OAuthワーキンググループでいくつかの議論がありました。私の会社(Ping Identity)は、商用OAuth AS(PingFederate)にこのようなアプローチを1つ考案しました:https ://support.pingidentity.com/s/document-item?bundleId=pingfederate-93&topicId=lzn1564003025072.html#lzn1564003025072__section_N10578_N1002A_N10001 。これには、OAuth 2.0を非常に補完するRESTベースの相互作用を使用します。


スコットT、Pingフェデレートの機能を利用する方法のコードサンプルを確認する方法はありますか?
JavaHead 2017

2
@JavaHeadここで私たちの開発者向けウェブサイト上でカバーされ、いくつかのより多くのプロトコルの詳細があります。developer.pingidentity.com/en/resources/...、トークンを検証するためのソースコードとして参照することができるのJSPのセットとしてPingFederateのOAuthの遊び場に発送します。それ(および他のオープンソースのライブラリやサンプル)はこちらからダウンロードできます。developer.pingidentity.com/en/code.html
スコット・T.

スコット、私は、ローカルのリソースサーバーとPingFederateが認証サーバーとして保護されたRest APIを使用したクライアント資格情報の付与を示すサンプルを探しています。次に、ローカルリソースサーバーが検証エンドポイントを呼び出します。そのようなことに遭遇しましたか?
JavaHead 2017

@JavaHeadもまた、PingFederate OAuth Playgroundを参照できるはずです。これは、クライアント資格情報付与タイプと、リソースサーバーによるアクセストークンの検証の両方を示しています。
スコットT.

JWTアクセストークンの場合、RSへのすべての着信要求に対してASイントロスペクションエンドポイントをヒットすることは通常は望ましくないと思います。どの場合、トークンの署名とスコープのRSチェックで十分ですか?または、RSはASからのイントロスペクション応答を一定期間キャッシュすることができますか?
ゲイリー

119

グーグルウェイ

Google Oauth2トークンの検証

リクエスト:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg

応答:

{
  "audience":"8819981768.apps.googleusercontent.com",
  "user_id":"123456789",
  "scope":"https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email",
  "expires_in":436
} 

マイクロソフトの方法

Microsoft-Oauth2承認を確認する

Githubウェイ

Github-Oauth2承認をチェック

リクエスト:

GET /applications/:client_id/tokens/:access_token

応答:

{
  "id": 1,
  "url": "https://api.github.com/authorizations/1",
  "scopes": [
    "public_repo"
  ],
  "token": "abc123",
  "app": {
    "url": "http://my-github-app.com",
    "name": "my github app",
    "client_id": "abcde12345fghij67890"
  },
  "note": "optional note",
  "note_url": "http://optional/note/url",
  "updated_at": "2011-09-06T20:39:23Z",
  "created_at": "2011-09-06T17:26:27Z",
  "user": {
    "login": "octocat",
    "id": 1,
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "somehexcode",
    "url": "https://api.github.com/users/octocat"
  }
}

アマゾンウェイ

Amazonでログイン-開発者ガイド(2015年12月、21ページ)

リクエスト :

https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...

対応:

HTTP/l.l 200 OK
Date: Fri, 3l May 20l3 23:22:l0 GMT 
x-amzn-RequestId: eb5be423-ca48-lle2-84ad-5775f45l4b09 
Content-Type: application/json 
Content-Length: 247 

{ 
  "iss":"https://www.amazon.com", 
  "user_id": "amznl.account.K2LI23KL2LK2", 
  "aud": "amznl.oa2-client.ASFWDFBRN", 
  "app_id": "amznl.application.436457DFHDH", 
  "exp": 3597, 
  "iat": l3ll280970
}

2
@gustavodiazjaimesサーバー側がトークンから割り当てられたユーザーIDを認識する方法はまったく説明されていません。
user2284570

22
賛成票がすべてわかりません。これは質問に答えていないようです。
ダンカンジョーンズ

発行されたトークンが有効かどうかを確認するための同様のエンドポイントがAzure Active Directoryにあるかどうか誰かが知っていますか?
user180940

2
言い換えれば、あなた自身をロールバックします。
AndroidDev 2018

51

@Scott T.の回答の更新:トークン検証のためのResource ServerとAuthorization Serverの間のインターフェイスは、2015年10月にIETF RFC 7662で標準化されました。https://tools.ietf.org/html/rfc7662を参照してください。検証呼び出しの例は次のようになります。

POST /introspect HTTP/1.1
Host: server.example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer 23410913-abewfq.123483

token=2YotnFZFEjr1zCsicMWpAA

とサンプルの応答:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "active": true,
  "client_id": "l238j323ds-23ij4",
  "username": "jdoe",
  "scope": "read write dolphin",
  "sub": "Z5O3upPC88QrAjx00dis",
  "aud": "https://protected.example.net/resource",
  "iss": "https://server.example.com/",
  "exp": 1419356238,
  "iat": 1419350238,
  "extension_field": "twenty-seven"
}

もちろん、ベンダーや製品による採用は、時間の経過とともに発生する必要があります。


使用している場合OoenId Connectには、我々は検証のアクセスにトークンIDを使用してのOpenIDの道を好むべきではないトークン:openid.net/specs/...
アドナン・kamili

1
@Renan:承認リクエストでスコープがリクエストされる方法と一致しscopeます。これは、スペースで区切られたスコープのリストが値に含まれるクエリパラメータを使用します
Hans Z.

4
行政機関によって正式に承認されていない場合は、「標準化された」という言葉を使用しないでください。2018年2月のIETF RFC 7662は、それが「提案」であることを明確に示しています。
AndroidDev 2018

1
@adnankamili「提案」というものはありません。ドキュメントがRFCになるときまでに、それはすでに「提案された標準」であり、その背後に大きな重みを持っています。OAuth 2.0自体はまだ「提案された標準」なので、あなたが何をしようとしているのかわかりません。
ペース

15

OAuth 2.0仕様ではその部分を定義していません。しかし、いくつかの選択肢があるかもしれません:

  1. リソースサーバーがAuthzヘッダーでトークンを取得すると、Authzサーバーの検証/イントロスペクトAPIを呼び出してトークンを検証します。ここで、Authzサーバーは、DBストアを使用するか、署名と特定の属性を検証することで、それを検証する場合があります。応答の一部として、トークンをデコードし、残りの有効期限とともにトークンの実際のデータを送信します。

  2. Authzサーバーは秘密キーを使用してトークンを暗号化/署名し、パブリックキー/証明書をリソースサーバーに提供できます。リソースサーバーがトークンを取得すると、署名を復号化/検証してトークンを検証します。コンテンツを取り出し、トークンを処理します。その後、アクセスを提供するか、拒否することができます。


8

OAuth v2仕様は次のことを示しています。

保護されたリソースへのアクセスに使用されるアクセストークン属性とメソッドは、この仕様の範囲外であり、コンパニオン仕様で定義されています。

私の承認サーバーには、リソースサーバーがaccess_tokenが有効かどうかを確認できるようにするWebサービス(SOAP)エンドポイントがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.