このページは Authlete 2.x 向けのドキュメントです。3.0 の内容は OAuth 2.0 Basics(3.0) をご覧ください。
はじめに
このドキュメントでは、OAuth 2.0 の Authorization Code Grant Flow に対応した認可サーバーを構築する際の、Authlete 2.x API(api.authlete.com)の基本的な利用方法について説明します。
構成
本チュートリアルでは以下の構成を想定します。なお、実サービスとして動作するのは、Authlete のコンソールと API だけです。 認可サーバーとリソースサーバーはいずれも実際には存在しませんが、それぞれのサーバーがクライアントから認可リクエストやトークンリクエスト、そしてトークンイントロスペクションリクエストを受信したときに、どのような API リクエストを Authlete に行うかを、curl コマンドを用いて試行します。
環境設定
チュートリアル「サインアップから Authlete サービス作成までの手順」に従い、新規 Authlete API サービスの作成と、そのサービスへのクライアント登録を行います。 本チュートリアルでは、環境設定の結果として以下の値を生成・指定したものとします。
この構成を用いて、次のセクションで認可コードグラントフローを試してみましょう。
認可コードグラントフローの実行からトークン利用までの流れ
シーケンス図を以下に示します。以降の説明においては、この図にあるメッセージ番号を併せてご参照ください。
1. クライアントから認可サーバーへの認可リクエスト送信
クライアントはユーザーエージェントを経由して、認可サーバーに認可リクエストを送信します(メッセージ番号 2, 3)。ここでは認可リクエストのパラメーターとして以下が指定されていたものとします。
認可サーバーは、ユーザーエージェントからのリクエストのクエリストリングとして、以下の内容(一部折り返しています)を受信することになります(メッセージ番号 3)。
- クライアント ID
12800697055611に相当するクライアントが、認可サーバーに登録されているかどうか - リダイレクト URI
https://client.example.org/cb/example.comが、そのクライアントに事前登録されているリダイレクト URI のどれかに合致するか - そのほかのパラメーター(
response_typeや、今回は指定していませんがscopeなど)が、そのクライアントに許可されている(クライアントが指定可能である)かどうか
Linux/Mac
Windows (PowerShell)
resultMessage, action, ticket です。
resultMessage: リクエストの処理結果をわかりやすく示しています。(参考: Authlete の result code について)action: 認可サーバーが次に何をすべきかを示します(ここではINTERACTION)。ticket: 認可フロー処理の次のステップにて、後述する別の Authlete API を呼ぶときに必要な値となります。
2. ユーザー認証とアクセス権限付与の確認
このチュートリアルの中では、ユーザーと具体的にどのようなインタラクションを行うかについては言及しません。多くの場合、認可サーバーはユーザーを何らかの方法(ID/パスワードなど)を用いて認証し、ユーザーのロールや権限を確認したのちに、クライアントに対するアクセス権限付与の確認を行います(メッセージ番号 6, 7)。 ここでは、ユーザー認証とアクセス権限付与の確認が成功し、ユーザーを一意に識別する値(subject)として testuser01 を用いるものとします。
3. 認可コードの発行
ユーザー認証とアクセス権限付与確認が完了すると、認可サーバーは Authlete の POST /auth/authorization/issue API を用いて認可コードの発行を指示します。認可サーバーは、ステップ 1 の/auth/authorization API のレスポンスから取得した ticket と、subject(testuser01)を、この API へのリクエストのパラメーターとして指定します。
Linux/Mac
Windows (PowerShell)
resultMessage, action, responseContent です。
resultMessage,action: 先の/auth/authorizationAPI と同様に、リクエストの処理結果と、認可サーバーが次に何をすべきかを示します。今回はactionの値としてLOCATIONが指定されています。これは、認可サーバーはクライアントにリダイレクトレスポンスを返却してくださいという意味です。responseContent: レスポンスの内容として指定する値です。
/auth/authorization/issue もしくは /auth/authorization/fail を使い分けることになります。
4. トークンリクエスト
認可コードを含むリダイレクトを受け取ったクライアントは、code の値を抽出してトークンリクエストを組み立て、認可サーバーに送信します(メッセージ番号 12)。ここではトークンエンドポイントを https://as.example.com/token とします。
Linux/Mac
Windows (PowerShell)
resultMessage, action, responseContent です。
resultMessage,action: これまでと同様に、リクエストの処理結果と、認可サーバーが次に何をすべきかを示します。今回はactionの値としてOKが指定されています。これは、正常に処理が完了したので認可サーバーはクライアントにレスポンスを返却してくださいという意味です。responseContent: レスポンスの内容として指定する値です。
5. API リクエスト(アクセストークン検証)
このあと実際には、クライアントはリソースサーバーに対してアクセストークンを含むリクエストを送信し、API の利用を試みます(メッセージ番号 16)。アクセストークンを受け取ったリソースサーバーは、以下を行う必要があります。- トークンが有効で、有効期限が切れていないかを確認する。
- トークンに付随するユーザー(
subject)とクライアント(clientId)の情報を取得する。 - API リクエストにどう応答すべきかを判断する。
/auth/introspection API が存在します。<API Key>, <API Secret>, <Token> はご自身の値に置き換えてください。
Linux/Mac
Windows (PowerShell)
usable, sufficient, expiresAt)や、アクセス認可を行なったユーザーの識別子(subject)、クライアント(clientId)などを取得します。そしてそれらの値に基づいて、クライアントに対する API レスポンスを決定できるようになります(メッセージ番号 19)。
まとめ
本チュートリアルでは、/auth/authorization、/auth/authorization/issue、/auth/token、/auth/introspection を用いて、認可サーバーに OAuth 2.0 の認可コードグラントフローを実装する際の Authlete 2.x API の利用方法について、実際の動作を確認しました。
次のステップ
- 認可コードフローで PKCE を必須化する: PKCE (2.x)
- OAuth 2.0 の上に OpenID Connect を追加する: OIDC Basics (2.x)
- エラーレスポンスの生成方法を学ぶ: 「fail」API を用いたエラーレスポンスの生成
- トークンの管理と失効: トークンのライフサイクルとポリシー
- 参考となる認可サーバー実装を調べる: 認可サーバー実装(参考: デモ認可サーバーの利用 (2.x))