Skip to main content

はじめに

UserInfo API が応答するクレームは ID トークンに任意のクレームを追加する方法と同様に、claims パラメータを利用することでカスタマイズできます。 この記事では、UserInfo エンドポイントのレスポンスに任意のクレームを追加する方法と、クレームの決定に役立つ Authlete の機能について解説します。

基本的な UserInfo エンドポイントの実装

OpenID プロバイダーが Authlete を利用し UserInfo API エンドポイントを実装する場合、以下の 2 つの API を呼び出す必要があります。 Authlete の Process UserInfo Request エンドポイントは提示されたアクセストークンを検証し、トークンに紐づくユーザーの情報を応答します。その応答をもとに、OpenID プロバイダーはトークンの有効性および紐づいたユーザーを確認し、対象ユーザーの属性をデータストアから収集し、Issue UserInfo Response API に提示します。 以下に例を示します。

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 レスポンスに含めたい
この場合、Authlete の consentedClaims を利用し、ユーザーが認可エンドポイントで RP に公開することを許可したクレームを、Introspection エンドポイント や UserInfo エンドポイントに伝達することが可能です。
consentedClaims は Authlete 2.3 以降で利用できます。 consentedClaims の詳細は Authlete Java Doc AuthorizationIssueRequest.html#setConsentedClaims() を確認ください。

ユーザーが提供に同意したクレームを Authlete に伝える

例えば、ユーザーが認可フローにおいて「氏名」「ユーザー名」「メールアドレス」を RP に伝えることに同意し、 OpenID プロバイダーがそれらの情報を UserInfo レスポンスに含める、といった実装を考えます。 認可エンドポイントは以下のようなリクエストを Authlete の Process Authorization Request API に送信します。
応答例 (一部省略)
OpenID プロバイダーは、氏名とユーザー名、メールアドレスを対象のクライアントに提供するための同意を得たのち、Issue Authorization Response API を呼び出します。この際に consentedClaims として name, username, email, email_verified を指定します。
Authlete 指定された consentedClaims をデータベースに保存し、Process UserInfo Request API や Process Introspection Request API の応答に含めます。
ここで consentedClaims に指定するクレームはあらかじめ対象サービスの トークン&クレーム > クレーム > サポート可能なクレーム に追加しておく必要がある点に注意してください。 supported claims
>

ユーザーが提供に同意したクレームを UserInfo レスポンスの応答に含める

先ほどの認可リクエストに紐づくトークンを、Process UserInfo Request API に送信すると、以下のような応答が得られます。
OpenID プロバイダーは claims 応答の代わりに、consentedClaims 応答を参照し、ユーザーが提供に同意したクレームを UserInfo レスポンスとして返却することが可能となります。
上記リクエストの結果、Issue UserInfo Response API は、以下のようにユーザーが提供に同意した「氏名」「ユーザー名」「メールアドレス」を含む UserInfo レスポンスを、responseContent の値として返却します。