ブラウザサイドでのOIDCシーケンスとインタフェース項目(WebAssemblyの場合)

概要

ASP.NET CORE6で、OpenIdConnect(access_token)を使用する場合のシーケンスおよび各要求・応答の項目の説明をします。
今回はテスト用のOIDCサーバを作成しているので、ブラウザ側、WEBサーバ側、OIDCサーバ側ともに説明します。

本ページは、シーケンスと項目の説明のため、実際のプログラムは、テスト用のOIDCサーバを自作する、および、ブラウザサイドのOIDCサーバの設定をご参照ください。
また、シーケンスの各チェックを何のために行っているかは、id_tokenやaccess_tokenのなりすまし防止についてをご参照ください。

シーケンス

項目

メタ情報(.well-known/openid-configuration)要求(GET)

No項目項目(日本語)備考
項目なし   

メタ情報応答(JSON)

No項目項目(日本語)備考
1issuer発行者oidc_serverトークン発行者。通常はOIDCサーバのURLが設定される。
2jwks_uri公開鍵URI{baseurl}/
AuthServer/Jwks
トークンの署名を複合化するための公開鍵取得用のURL
3authorization_
endpoint
認証エンドポイント{baseurl}/
AuthServer/Auth
認可コード(code)やid_tokenを取得するためのURL
4token_endpointトークンエンドポイント{baseurl}/
AuthServer/Token
id_tokenやaccess_tokenを取得するためのURL。認可コード(code)を指定して取得する(code -> tokenのシーケンス)。
トークン有効期限切れの際のリフレッシュにも使用される(Blazor WebAssembly経由の場合)
5response_types_
supported
サポート対象レスポンスタイプcode, id_token
(リスト)
認証エンドポイントでサポートされるタイプ
今回のテスト用OIDCサーバでは、
code または id_tokenのみサポートしている。
6introspection_
endpoint
イントロスペクションエンドポイントイントロスペクション(トークンの有効性チェック)のためのURL。
今回のテスト用OIDCサーバでは未対応。
access_tokenで、Webクライアントから渡されたトークンをWebサーバで有効性をチェックする際に、OIDCサーバにトークンの有効性のチェックを依頼するために使用する。
イントロスペクションを使わない場合は、Webサーバ側でトークンの署名チェック、Audience, Issuer、有効期限チェックを行う。
7userinfo_endpointユーザ情報エンドポイント{baseurl}/
AuthServer/UserInfo
ユーザ情報を取得するためのURL
8end_session_
endpoint
エンドセッションエンドポイントログアウトする際のURL。
今回のテスト用OIDCサーバでは未対応

code要求(GET)

No項目項目(日本語)備考
1response_typeレスポンスタイプcodecode or id_tokenを指定する。
認可の場合はcodeを、id_token取得の場合はid_tokenを指定する。
普通はid_tokenを指定で問題ない。
2client_idクライアントIDtest_clientOIDCサーバから見たクライアント(ブラウザやBlazor WebAssembly)のIDを指定する。OIDCサーバとクライアント間で使用するクライアントIDを取り決めておく(OIDCサーバにクライアントIDを登録しておく感じ)。
3redirect_uriリダイレクトURL{baseUrl}/
authentication/
login-callback
codeやid_tokenを返却するリダイレクト先。
ASP.NETのBlazor WebAssemblyのデフォルトは/authentication/login-callback。
4stateステートランダムな文字列
例)CfDJ8NoLZtPk-
fNLjKQV2jeAXteq52
Pdb_9Uvg8miGfZuZ
0・・・(省略)
codeやid_tokenの要求に対する応答であることをチェックするために使用する。
5scope利用範囲openid profileopenidを含めると認証のために使用することを示す。profileを含めるとユーザ情報の取得に使用することを示す。
6nonceトークン受け入れチェックnullOIDCサーバから返却されたトークンをBlazor WebAssembly側で2重に受け入れないようにするために使用する。
codeの場合はnullで、代わりにcode_challengeでcodeの不正利用を防ぐ。
7promptログインプロンプト初回:none
noneでエラー
だった場合:null
id_token(code -> id_token含む)の場合はnull。
access_token取得の場合はnone or nullが設定される。
8code_challengeコードチャレンジランダムな文字列
例)p8Er408nFvUJakBmmy
bVKrPqVD_dsYxkMhU3r0u
zm24
id_tokenの場合はnull。
codeの場合はランダムなハッシュ値をもとにしたBase64UInt文字列。
9code_challenge_
method
コードチャレンジハッシュ化方式S256id_tokenの場合はnull。
codeの場合はハッシュ化方式。ASP.NETの場合はS256。
10response_modeレスポンスモードquery応答の形式を指定する。
queryの場合は、GETの応答としてクエリー文字列でcodeを返却する

code応答(GET)

No項目項目(日本語)備考
1code認可コード任意の一意な値codeの値に決まりはなく、OIDCサーバが、OIDCサーバ内のセッションを特定するための情報を返却する。後続のtoken要求時に、OIDCサーバはリクエストに含まれたcodeの値でセッションを特定し、該当セッションに紐づくユーザのTokenを返却する。
2stateステートcode要求のstateをそのまま返却する 

token要求(POST)

No項目項目(日本語)備考
1grant_type権限タイプ初回:
authorization_
code
token期限切れ時:
refresh_token
通常はauthorization_codeが指定され、tokenの有効期限が切れた場合は、refresh_tokenが指定される。
grant_typeに”refresh_token”が指定された場合、別途refresh_token項目も要求に受け渡されるので、refresh_tokenの値をもとに、tokenを再発行する。
なお、refresh_token項目は、OIDCサーバがtoken応答で返却した値がBlazor WebAssemblyによってそのまま渡される。
2client_idクライアントIDtest_clientOIDCサーバから見たクライアント(Blazor WebAssembly)のIDを指定する。OIDCサーバとクライアント間で使用するクライアントIDを取り決めておく(OIDCサーバにクライアントIDを登録しておく感じ)。
3redirect_uriリダイレクトURL{baseUrl}/
authentication/
login-callback
codeやid_tokenを返却するリダイレクト先。
ASP.NETのBlazor WebAssemblyのデフォルトは/signin-oidc。
4code認可コード任意の一意な値OIDCサーバがCode応答で返却したcodeがそのまま渡される。
OIDCサーバはcodeの値をもとにセッションを特定し、ユーザIDなどが設定されたAccess_Tokenを返却する。
5code_verifierCodeチェックランダムな文字列
例)
1795b21ed21c4
b24b3b30bcfef6
5f6c3b200efb41
4ba4f2a855cef2
449d741b5771e
c60bb3a34de69
65dcef2d52619
24
code_verifierをcode_challenge_method(ここではS256)でハッシュ化しBase64UInt文字列に変換する。その値とcode_challengeの値を比較し、一致していたらcodeを要求した人と、tokenを要求した人が同じであると判断する。

token応答(JSON)

No項目項目(日本語)備考
1access_tokenアクセストークン備考参照認証情報。idトークンと同じ値がセットされていることが多い。
今回のテスト用プログラムではidトークンと同じ値をセットしている。
id情報、issuer, audience, 署名, 有効期限、署名複合化のための公開鍵キーID(jwksのキーID)が含まれる。
2id_tokenidトークン備考参照id情報
3expires_in有効期限86400トークンを発行後、期限が切れるまでの時間を秒で指定する。
4refresh_
expires_in
リフレッシュ期限86400トークンを発行後、リフレッシュするまでの時間を秒で指定する。
有効期限よりも短くすると有効期限が切れる前にリフレッシュする。
.NETフレームワークでは未対応と思われる。
5refresh_tokenリフレッシュトークンOIDCのセッションを特定するための情報通常はセッションと紐づくようなキー情報を設定する。
テスト用プログラムでは、クライアントIDとユーザIDを設定している。
6scopeスコープopenid email profile 
7token_typeトークンタイプBearer固定。

ユーザ情報要求(GET)

No項目項目(日本語)備考
項目なし   

ユーザ情報応答(JSON)

No項目項目(日本語)備考
1nameユーザ名ユーザの名前 
2iss発行者発行者(OIDC Server) 
3aud利用者(Audience, client_id)利用者(OIDC Client) 
4subユーザIDユーザを特定するID 

公開鍵(jwks)要求(GET)

No項目項目(日本語)備考
項目なし   

公開鍵応答(JSON)

No項目項目(日本語)備考
 Keysキーリスト 複数の公開鍵を返却することができる
公開鍵のうち、トークンのヘッダに設定されているkidと公開鍵のkidが一致するものが使用される。
1 ktyキータイプRSA暗号鍵のタイプ
2 algアルゴリズムRS256暗号アルゴリズム
3 usepublic key use(暗号キーの用途)sig暗号キーの用途。sigの場合は署名に使用する。
enc は暗号キーを暗号化するための暗号キーとして使用される(わからん)。
4 nModulus(モジュラス)備考参照秘密鍵から生成した公開鍵のModulus部分。
Base64UInt文字列。
5 eExponent(指数)備考参照秘密鍵から生成した公開鍵のExponent部分。
Base64UInt文字列。
6 kidキーIDtest_client公開鍵は複数登録されていることがある。
id_tokenやaccess_tokenには、署名に使われた鍵のkidが含まれているので、そのkidと一致する公開鍵情報を使用する。
今回のテスト用プログラムでは、kidにclient_idを指定している。