はじめに
Userinfo API が応答するクレームは ID トークンに任意のクレームを追加する方法 と同様に、claims パラメータを利用することでカスタマイズできます。 この記事では Userinfo エンドポイントのレスポンスに任意のクレームを追加する方法と、クレームの決定に役立つ Authlete の機能について解説します。基本的な Userinfo エンドポイントの実装
OpenID プロバイダーが Authlete を利用し Userinfo API エンドポイントを実装する場合、以下の 2 つの API を呼び出す必要があります。- Userinfo Request /api//auth/userinfo
- Issue Userinfo Response /api//auth/userinfo/issue
Userinfo Request API の呼び出し例
具体的な例は以下の通りです。まず OpenID プロバイダーはユーザーが提示したアクセストークンを Authlete の Userinfo Request API に送信します。action が OK でトークンが有効であることが示され、さらに subject が john であると判別できるため、 OpenID プロバイダーは john に紐づく属性を収集し、 Issue Userinfo Response に提示します。
Issue Userinfo Response の呼び出し例
Authlete はユーザーに紐づく属性の値は保持しないため、Userinfo エンドポイントの応答に含める属性の値は OpenID プロバイダーが用意する必要があります。一方、OpenID プロバイダーは Userinfo に含める属性を決定するために Authlete が応答するclaims パラメータを利用できます。
Userinfo Request API の 応答に含まれる claims パラメータは IDトークンに追加する「クレーム」の判別 と同様に、/auth/authorization エンドポイントに提示された parameters 内の スコープ(scope)に対応するクレーム と、claims パラメーターを用いて個別に指定されるクレームがマージされたリストです。
例えば上記例では scope に openid email が含まれていたため、email スコープが展開され email, email_verified が含めるべきクレームとして claims 応答に含まれます。スコープとそれに対応するクレームの一覧は Authlete Java Common の Javadoc ClaimsScope をご確認ください。
ここでは OpenID プロバイダーが Authlete からの応答 claims に含まれる以下の項目を Userinfo レスポンスに追加する例を示します。
| 項目 | 値 |
|---|---|
| ”email" | "john@example.com" |
| "email_verified” | true |
responseContent のクレームに指定したクレームが追加されていることが確認できます。
含めるべきクレームのリストをカスタマイズする
Authlete が自動で計算するclaims は OpenID Connect Core の仕様に則したものですが、実際の運用環境には適さない場合があります。例えば ID トークンに含めるクレームと異なるクレームを Userinfo から返したい、scope は openid, email のみを指定するが OpenID プロバイダーがユーザーの同意内容をもとに追加のクレームを Userinfo エンドポイントから応答したいといった要件があるでしょう。
この場合、Authlete の consentedClaims を利用しユーザーが認可エンドポイントで RP に公開することを許可したクレームを、Introspection エンドポイント や Userinfo エンドポイントに伝達することが可能です。
consentedClaimsは Authlete 2.3 以降で利用できます。consentedClaimsの詳細は Authlete Java Doc AuthorizationIssueRequest.html#setConsentedClaims() を確認ください。
ユーザーが提供に同意したクレームを Authlete に伝える
例えばユーザーが認可処理を行った際、氏名とユーザー名、メールアドレスを RP に伝えることに同意し、 OpenID プロバイダーの実装ではそれらの情報を Userinfo エンドポイントから情報を返すような実装を考えます。 認可エンドポイントは以下のようなリクエストを Authlete に送信しチケットを得ます。auth/authorization/issue エンドポイントを呼び出します。この際に consentedClaims として name, username, email, email_verified を指定します。
consentedClaims をデータベースに保存し、/auth/userinfo や /auth/introspection の応答に含めます。
ここで>consentedClaimsに指定するクレームはあらかじめ対象サービスのトークン&クレーム>クレーム>サポート可能なクレームに追加しておく必要がある点に注意してください。
ユーザーが提供に同意したクレームを Userinfo API の応答に含める
先ほどの認可リクエストに紐づくトークンを Userinfo Request API に送信すると以下のような応答が得られます。claims 応答の代わりに、consentedClaims 応答を参照し、ユーザーが提供に同意したクレームを Userinfo エンドポイントの応答として返却することが可能となります。
