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