OAuth Authorization ServerのOpenID Connect対応
OAuth Authorization Serverでサインイン用スコープ(openid / profile / email)を許可すると、この認可サーバーはOpenID Connectの認可サーバーとして、メンバーのサインイン情報(claim)をクライアントに連携します。付与されたスコープにopenidが含まれる場合にのみ、id_tokenの発行とuserinfoエンドポイントでのclaim取得が有効になります。
OAuth Authorization Serverの設定方法はOAuth Authorization Serverを参照してください。
基本情報
| 項目 | 内容 |
|---|---|
| 種別 | OpenID Connect(id_token / userinfo / JWKS) |
| 対象 | OAuth Authorization Server(用途がAPI / Management / AdminMCPのいずれか) |
| 利用場面 | OAuthクライアントがメンバーのサインイン情報(claim)を取得する場合 |
メタデータ
OAuth Authorization Serverの編集画面の[メタデータURL]にアクセスすると、この認可サーバーの設定情報(Authorization Server Metadata)がJSON形式で返されます。issuer・authorization_endpoint・token_endpointなどOAuth 2.0の基本的な項目に加えて、次の項目が含まれます。
jwks_uri:JWKSエンドポイントのURLuserinfo_endpoint:userinfoエンドポイントのURL(発行可能なスコープにopenidが含まれる場合)subject_types_supportedid_token_signing_alg_values_supported(RS256)claims_supported
以降のJWKS・userinfoの各エンドポイントのURLは、このレスポンスから確認できます。
SSOで利用する認可リクエスト 提供版: β版
同一組織で管理するサービス間のSSOでは、OAuth Authorization Server クライアントで[信頼済みクライアント]を有効にすると、Kurocoのログインセッションを利用して同意画面を省略できます。[信頼済みクライアント]の設定方法はOAuth Authorization Server クライアントの編集を参照してください。
認可エンドポイントのURLは、メタデータのauthorization_endpointで確認できます。ログイン画面や同意画面を表示せずに認可できるか確認する場合は、prompt=noneを指定します。挙動が変わるpromptの値は、メタデータのprompt_values_supportedで確認できます。
GET {authorization_endpoint}?response_type=code&client_id={client_id}&redirect_uri=https%3A%2F%2Fclient.example%2Fcallback&scope=openid+profile+email&state={state}&nonce={nonce}&code_challenge={code_challenge}&code_challenge_method=S256&prompt=none
scope内のスコープは空白または+で区切り、promptなど別のパラメータとは&で区切ります。
promptによる挙動
prompt | ログインセッションなし | ログイン済み・信頼済みクライアント | ログイン済み・その他のクライアント |
|---|---|---|---|
| 指定なし | ログイン画面を表示します。 | 同意画面を表示せず、認可コードを発行します。 | 同意画面を表示します。 |
none | 画面を表示せず、login_requiredを返します。 | 同意画面を表示せず、認可コードを発行します。 | 画面を表示せず、consent_requiredを返します。 |
consent / login / select_account / その他の値 | ログイン後に同意画面を表示します。 | 同意画面を表示します。 | 同意画面を表示します。 |
none以外の値は、ユーザーの操作を要求するものとして扱われるため、信頼済みクライアントでも同意画面を表示します。メタデータのprompt_values_supportedで公開しているのはnoneとconsentのみで、prompt=loginでログイン済みユーザーの再認証は行わず、prompt=select_accountでアカウント選択画面は表示しません。
prompt=noneは他の値と同時に指定できません。none consentのように組み合わせた場合はinvalid_requestを返します。また、ログイン済みのアカウントが認可の対象外の場合はaccess_deniedを返します。
[信頼済みクライアント]は、自社・同一組織で管理するクライアントにのみ使用してください。同意画面は省略されますが、リダイレクトURI、スコープ、リソース、PKCEなどの検証は通常どおり行われます。
id_token
トークンエンドポイントは、認可コード・リフレッシュトークン・クライアント認証情報などをアクセストークンに交換するためのエンドポイントです(URLはメタデータのtoken_endpointで確認できます)。付与されたスコープにopenidが含まれる場合、このエンドポイントのレスポンスに、アクセストークンに加えてRS256で署名されたid_token(JWT)が含まれます。
id_tokenには、常にiss(発行元)・sub(メンバーID)・aud(クライアントID)・iat・expが含まれ、認可リクエストでnonceが指定された場合はnonceも含まれます。認証時刻を特定できる場合はauth_timeも含まれます。[信頼済みクライアント]が既存のログインセッションを利用して同意画面を省略した場合、auth_timeは含まれません。profile・emailスコープに応じて追加されるclaimは、スコープとclaimの対応を参照してください。
JWKSエンドポイント
id_tokenの署名を検証するための公開鍵を、JWK Set形式(RFC 7517)で配信します。エンドポイントのURLはメタデータのjwks_uriで確認できます。署名鍵は認可サーバーごとに管理され、初回アクセス時に生成されます。
userinfoエンドポイント
アクセストークンを用いて、メンバーのclaimを取得できます。
| 項目 | 内容 |
|---|---|
| メソッド | GET / POST |
| 認証 | Authorization: Bearer <access_token>ヘッダーで認証します(クエリパラメータでのアクセストークン指定には対応していません)。 |
| レスポンス | 付与されたスコープに応じたclaim(必ずsubを含む)をJSON形式で返します。 |
エンドポイントのURLは、メタデータのuserinfo_endpointで確認できます。
スコープとclaimの対応
付与されたスコープに応じて、id_tokenおよびuserinfoで返されるclaimが決まります。
| スコープ | claim | 取得元 |
|---|---|---|
openid | sub | メンバーID |
profile | name | 氏名(姓 + 名) |
profile | family_name | 姓 |
profile | given_name | 名 |
profile | preferred_username | ログインID |
profile | updated_at | メンバー情報の更新日時(Unixタイム) |
email | email | メールアドレス |
email | email_verified | 常にtrue(Kurocoはメールアドレスの検証フローを持たないため、固定値です) |
同意画面での共有情報
openidを含むスコープが要求された場合、同意画面には、クライアントに共有されるサインイン情報(claimの実際の値)が「共有される情報」として表示されます。スコープ名だけでなく、実際に連携されるメンバー情報を確認したうえで許可できます。
関連ドキュメント
サポート
お探しのページは見つかりましたか?解決しない場合は、問い合わせフォームからお問い合わせいただくか、Slackコミュニティにご参加ください。