アクセストークンのaudクレームとIDトークンのaudクレーム
audクレームの使い方について。
draft-ietf-oauth-json-web-token-11
4.1.3. "aud" (Audience) クレーム
aud(audience)クレームは JWT を利用することが想定された主体の識別子一覧である. JWT を処理するために意図されたそれぞれの対象は, オーディエンスクレームの値に自身の識別子が含まれていることを確認し, aud に自身の識別子が含まれない場合はその JWT の処理を拒否しなければならない(MUST). 一般的な場合において, aud クレームの値は文字列あるいは StringOrURI 値の配列である. JWT が単一のオーディエンスから構成される場合に限って, aud の値は単一の文字列あるいは StringOrURI 値でもよい(MAY). オーディエンス値の解釈は一般的にアプリケーション固有である. このクレームの使用は任意である(OPTIONAL).
JWTの仕様ではaudクレームは「JWTを利用する主体を表現するため」のクレームらしい。
OAuth 2.0の認可を受けたクライアントはアクセストークンを検証せずにリソースサーバに送る。(アクセストークンとしてJWTが使われていれば)リソースサーバがJWTの検証をするので、そのときにリソースサーバ自身のURIがaudに含まれていることを確認して、もし含まれていなければ検証失敗にする必要がある。 つまりアクセストークンのaudはアクセスされるリソースサーバのURIを入れるのが正しい?
OpenID Connect Core 1.0 incorporating errata set 1
aud
REQUIRED. ID Token の想定されるオーディエンス (Audience). この値は Relying Party の OAuth 2.0 client_id を含まなければならない (MUST). 他のオーディエンスの識別子を含んでもよい (MAY). 一般的には aud は大文字小文字を区別した文字列の配列であるが, オーディエンスが単体の場合は aud 値を大文字小文字を区別した単一文字列としてもよい (MAY).j
OpenIDの仕様としてはJWT (ID Token) の検証をする主体がIDPのクライアントになるので、クライアントが自身のclient_idがaudに含まれていることを確認して、もし含まれていなければ検証失敗にする必要がある。
参考:
Web APIを認証/認可サーバで保護して他のアプリケーションに公開する場合 → アクセストークン使いましょう
Web APIを自分のアプリケーションの一部(バックエンドサービス)として作成して保護する場合 → IDトークン使いましょう
第3者サービスのユーザに認可するのではなく「自分のサービスのユーザのアクセス可否を判断するのにIDトークンを使う」というのは一般的みたい。
We'll wrap things up with a discussion of why you should always secure an API with an Access Token, not an ID Token.
OpenID Connect issues an identity token, known as an ID Token, while OAuth 2.0 issues an Access Token.
ID Token example:
{
"sub": "auth0|123456",
"aud": "YOUR_CLIENT_ID",
"exp": 1311281970,
"iat": 1311280970,
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"gender": "female",
"birthdate": "0000-10-31",
"email": "janedoe@example.com",
}
AccessToken example:
{
"sub": "auth0|123456",
"aud": [
"my-api-identifier",
],
"azp": "YOUR_CLIENT_ID",
"exp": 1489179954,
"iat": 1489143954,
"scope": "openid profile email address phone read:appointments"
}