このページは Authlete 2.x 向けのドキュメントです。3.0 の内容はOIDC Basics(3.0)をご覧ください。
はじめに
このドキュメントでは、OpenID Connect (OIDC) の Authorization Code Flow に対応したアイデンティティプロバイダーを構築する際の、Authlete API の基本的な利用方法について説明します。構成
本チュートリアルでは以下の構成を想定します。なお、実サービスとして動作するのは、Authlete のコンソールと API だけです。 認可サーバー(OIDC アイデンティティプロバイダー)とリソースサーバーはいずれも実際には存在しませんが、それぞれのサーバーがクライアント(OIDC リライングパーティ)から認可リクエストやトークンリクエスト、そしてトークンイントロスペクションリクエストを受信したときに、どのような API リクエストを Authlete に行うかを、curl コマンドを用いて試行します。本チュートリアルでは便宜上、OIDC アイデンティティプロバイダーを「認可サーバー」、同リライングパーティを「クライアント」と表記します。
環境設定
環境設定の内容は OAuth 2.0 Basics(2.x) と同一です。もしその環境を用いるのであれば、本セクションの作業は省略可能です。
この構成を用いて、認可サーバーとクライアントからなる、OIDC 認可コードフローを試してみましょう。
OIDC 認可コードフローの実行から ID トークン取得までの流れ
シーケンス図を以下に示します。以降の説明においては、この図にあるメッセージ番号を併せてご参照ください。
クライアントから認可サーバーへの認可リクエスト送信
クライアントはユーザーエージェントを経由して、認可サーバーに OIDC 認証リクエスト(認可リクエスト)を送信します(メッセージ番号 2, 3)。ここでは認可リクエストのパラメーターとして以下が指定されていたものとします。
認可サーバーは、ユーザーエージェントからのリクエストのクエリストリングとして、以下の内容(一部折り返しています)を受信することになります(メッセージ番号 3)。
scope の値が openid、かつ response_type の値が code であることから、リクエストを OIDC 認可コードフローとして処理することになります。
- クライアント ID
12898884596863に相当するクライアントが、(scope=openidであることから)単なる OAuth クライアントとしてではなく、OIDC リライングパーティとして認可サーバーに登録されているかどうか - リダイレクト URI
https://client.example.org/cb/example.comが、そのクライアントに事前登録されているリダイレクト URI のどれかに合致するか - そのほかのパラメーター(レスポンスタイプやスコープなど)が、そのクライアントに許可されている(クライアントが指定可能である)かどうか
<API Key>、<API Secret>、<Client ID> は、本チュートリアルの過程にて生成された値に置き換えてください。
curl ではなく curl.exe とすること、" をエスケープすること、行の区切りに ` を用いることにご注意ください。
resultMessage、action、ticket です。
resultMessage: リクエストの処理結果をわかりやすく示しています(参考: Authlete の result code について)。さらにopenid=trueとなっており、OIDC プロトコルとして処理されるということがわかります。action: 認可サーバーが次に何をすべきかを示します。ticket: 認可フロー処理の次のステップにて、後述する別の Authlete API を呼ぶときに必要な値となります。
ユーザー認証と認証結果提供の確認
このチュートリアルの中では、ユーザーと具体的にどのようなインタラクションを行うかについては言及しません。多くの場合、認可サーバーはユーザーを何らかの方法(ID / パスワードなど)を用いて認証し、ユーザーのロールや権限を確認したのちに、前述した認証結果提供の確認を行います(メッセージ番号 6, 7)。認可コードの発行
ユーザー認証と認証結果提供の確認が完了することにより、認可サーバーは以下の状態に至ったとします。- ユーザーを特定した。そのユーザーを一意に識別するために Authlete と共有する値(
subject)としてtestuser01を用いる。 - ユーザーから、クライアントに対する認証結果提供の許可を得た。
subject と、先ほど /auth/authorization API のレスポンスから取得した ticket の値を、この API へのリクエストのパラメーターとして指定します。ここでは curl コマンドを以下のように実行します(メッセージ番号 8)。なお <API Key>、<API Secret>、<Ticket> は、本チュートリアルの過程にて生成された値に置き換えてください。
resultMessage、action、responseContent です。
resultMessage、action: 先の/auth/authorizationAPI と同様に、リクエストの処理結果と、認可サーバーが次に何をすべきかを示します。今回はactionの値としてLOCATIONが指定されています。これは、認可サーバーはユーザーエージェントにリダイレクトレスポンスを返却してくださいという意味です。responseContent: レスポンスの内容として指定する値です。
/auth/authorization/issue もしくは /auth/authorization/fail を使い分けることになります。
トークンリクエスト
先のレスポンスを認可サーバーがユーザーエージェントに返却した結果、ユーザーエージェントは以下のリクエスト(一部折り返しています)をクライアントに送信することになります(メッセージ番号 11)。code の値を抽出し、トークンリクエストを組み立て、認可サーバーに送信します(一部折り返しています)。ここではトークンエンドポイントを https://as.example.com/token とします(メッセージ番号 12)。
<API Key>、<API Secret>、<Client ID>、<Client Secret>、<Code> は、本チュートリアルの過程にて生成された値に置き換えてください。
resultMessage、action、responseContent です。
resultMessage、action: これまでと同様に、リクエストの処理結果と、認可サーバーが次に何をすべきかを示します。今回はactionの値としてOKが指定されています。これは、正常に処理が完了したので認可サーバーはクライアントにレスポンスを返却してくださいという意味です。responseContent: レスポンスの内容として指定する値です。
ID トークンの利用
レスポンスを受け取ったクライアントは、その中に含まれるid_token の値のデコード・検証を行うことになります。本チュートリアルでは Online JWT Verifier を用いてデコードを試します。
Online JWT Verifier (https://kjur.github.io/jsrsasign/tool/tool_jwtveri.html)
上記のページにアクセスし、「(Step1) Set JWT(JSON Web Token) to verify.」のフィールドに、id_token の値 eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0dXNlcjAxIiwiYXVkIjpbIjEyODk4ODg0NTk2ODYzIl0sImlzcyI6Imh0dHBzOi8vYXV0aGxldGUuY29tIiwiZXhwIjoxNTU5MTA2ODE1LCJpYXQiOjE1NTkwMjA0MTUsIm5vbmNlIjoibi0wUzZfV3pBMk1qIn0.5uSFMTGnubyvtiExHc9l7HT9UsF8a_Qb0STtWzyclBk を(事前に入っている値を上書きするかたちで)コピーアンドペーストします。
そして「(Step3) Verify.」にある「Just Decode JWT」ボタンを押下すると、「Parsed JWT」のセクションにデコードされた結果が表示されます。

- Header
- Payload
issが Authlete の初期値であるhttps://authlete.comのままになっています。これは本チュートリアルにおける認可サーバーhttps://as.example.comとする必要があります。- ユーザーに関する属性情報としては識別子である
subしか含まれていませんが、クライアントの利便性を考えると、その他のユーザー属性も併せて提供するほうが良いかもしれません。
iss の値を修正し、ユーザー情報として他のクレームを追加してみます。
ID トークンの修正と拡張
発行者識別子の修正
Authlete のサービス管理者コンソール https://so.authlete.com/accounts/login にログインし、本チュートリアルの過程にて作成したサービスを選択します。下方にある「編集」ボタンをクリックし、内容を編集可能にします。
https://authlete.com」になっているはずです。これを「https://as.example.com」に変更し、下方にある「更新」ボタンをクリックします。確認のダイアログが表示されるので「OK」をクリックします。

iss)の値が変更されました。
認可リクエスト
先ほどと同じ認可リクエスト(便宜上nonce も同じ値を設定しています)を、Authlete の POST /auth/authorization API に送信してみましょう(メッセージ番号 4)。なお <API Key>、<API Secret>、<Client ID> は、本チュートリアルの過程にて生成された値に置き換えてください。
ID トークンの拡張(クレームの追加)
それでは POST /auth/authorization/issue API を呼び出し、認可コードの発行を行います。なお<API Key>、<API Secret>、<Ticket> は、本チュートリアルの過程にて生成された値に置き換えてください。
また、この API を呼び出す際に、以下のクレームを追加してみます。
クレームの追加には
claims パラメーターを利用します。リクエストは以下のようなかたちになります。
トークンリクエスト
クライアントはトークンリクエスト(一部折り返しています)を認可サーバーに送信します。<API Key>、<API Secret>、<Client ID>、<Client Secret>、<Code> は、本チュートリアルの過程にて生成された値に置き換えてください。
id_token の値のデコードを行ってみましょう。
上記のページにアクセスし、「(Step1) Set JWT(JSON Web Token) to verify.」のフィールドに、id_token の値 eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiVGVzdCBVc2VyIiwiZW1haWwiOiJ0ZXN0dXNlcjAxQGV4YW1wbGUuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImlzcyI6Imh0dHBzOi8vYXMuZXhhbXBsZS5jb20iLCJzdWIiOiJ0ZXN0dXNlcjAxIiwiYXVkIjpbIjEyODk4ODg0NTk2ODYzIl0sImV4cCI6MTU1OTEzNzMwMSwiaWF0IjoxNTU5MDUwOTAxLCJub25jZSI6Im4tMFM2X1d6QTJNaiJ9.8ngbBoGLUvHXIO4VyGN0-txJfE5Yq86xElMSxqGlLv0 を(事前に入っている値を上書きするかたちで)コピーアンドペーストします。
そして「(Step3) Verify.」にある「Just Decode JWT」ボタンを押下すると、「Parsed JWT」のセクションにデコードされた結果が表示されます。

- Header
- Payload
iss の値を確認することができました。またクレームとして、name、email、email_verified が正しく追加されていることもわかります。
まとめ
本チュートリアルでは、以下の 2 点について、実際の動作を確認しました。- 認可サーバー(OIDC アイデンティティ・プロバイダー)に認可コードフローを実装する際の Authlete API の利用方法
- 発行者識別子の修正とクレームの追加
次のステップ
チュートリアルの次のステップとして以下を試し、Authlete への理解を深めましょう。- OAuth 2.0 Basics(2.x) — OIDC を用いない認可コードフロー。
- PKCE(2.x) — 認可コードフローで PKCE を必須にする。
- POST /auth/authorization/fail API(参考: 「fail」API を用いたエラーレスポンスの生成)
/auth/userinfoAPI(参考: Userinfo API におけるアクセストークン検証)- トークン管理 API(参考: ユーザーがクライアントに与えた認可・発行済みトークンの管理)
- 認可サーバー実装(参考: デモ認可サーバーの利用(2.x))
- 公開鍵暗号による ID トークンの署名(参考: ID トークンの署名鍵の変更)