このページは Authlete 3.0 用です。2.x については こちらのページ をご覧ください。認可・トークン・イントロスペクションの API は API リファレンス で試すこともできます。
はじめに
このチュートリアルでは、OAuth 2.0 の認可コードグラントフローをサポートする認可サーバーを実装するために Authlete API を使用する基本的な方法を説明します。また、リソースサーバーがアクセス トークンを迅速に検証し、安全で認可された API へのアクセスを提供するために Authlete API を使用する方法も示します。 前提条件:- OAuth 2.0 の基本的な知識
- Authlete アカウントへのアクセス権 (必要に応じてこちらからサインアップしてください)。
コンポーネント
一般的な OAuth 2.0 アーキテクチャには、以下のフロー図に示すように、複数のコンポーネントが含まれます。このチュートリアルでは、Authlete 管理コンソール と、米国リージョンで稼働する Authlete API クラスター (https://us.authlete.com) のパブリッククラウドバージョンを使用します。認可サーバーおよびリソースサーバーは curl コマンド等を使用してシミュレートし、認可、トークン発行、およびイントロスペクションのために Authlete へ API リクエストを行う方法を示します。
各コンポーネントの FQDN は以下の通りです。認可サーバーおよびクライアントは curl でシミュレーションするため実際には FQDN は利用されませんが、以下の値を使用して OAuth フローを説明します。
環境セットアップ
「API を使ってみる」に従って、新しい Authlete サービスとクライアントを作成してください。また、Authlete API の呼び出しに必要なサービスアクセストークンを生成してください。以下の入力欄に値を入れると、以降のサンプルコード(コマンド)が自動で更新されます。(SDK タブのサービスアクセストークンは、ハードコードではなく環境変数SERVICE_ACCESS_TOKEN から読み込む形にしています。)
ウォークスルー
以下のシーケンス図は、このチュートリアルで使用される OAuth 2.0 フロー全体を示しています。各ステップを進める際に参照してください。クライアントから認可サーバーへの認可リクエスト
クライアントは、ユーザーエージェントを介して認可サーバーに認可リクエストを行います(ステップ 3 および 4)。 このチュートリアルでは、リクエストのパラメーターとして以下の値が指定されているものと仮定します(環境セットアップの入力欄の値が反映されています)。 本記事では、認可サーバーはユーザーエージェントから以下のような HTTP GET クエリ文字列を受け取るとします(可読性のため折り返しを追加しています)。 一般的な認可サーバーは、以下のルールを評価してから認可コードグラントフローを進める必要があります。- クライアント ID 「」に関連付けられたクライアントが認可サーバーに登録されていることを確認する。
- リダイレクト URI 「」がクライアントに登録された URI のいずれかと一致することを確認する。
response_typeやscopeなどの他のパラメーター値がクライアントによってリクエスト内で指定されることが許可されていることを確認する。
/auth/authorization API です。
Authlete API にリクエストを送信する(ステップ 5)ためのコマンド/コードを、以下の言語タブから選択してください。各タブの値は、前述の入力欄の値を変えると自動更新されます。
resultMessageは、リクエスト処理の結果を人間が読める形式で提供します(詳細は Authlete の結果コードの解釈 を参照)。actionは、認可サーバーが次に何を行うべきかを示します(詳細は アクションハンドリング を参照)。ticketは、次のステップで別の API にリクエストを行うために認可サーバーが必要とする値です(詳細は 2 段階の API 呼び出し を参照)。
ユーザー認証とアクセス許可の確認
リソース所有者と認可サーバーの間の実際のやり取りは、このチュートリアルの範囲外です。通常、認可サーバーはユーザーの資格情報(例: ID とパスワード)を使用してユーザーを認証し、ユーザーの役割や権限を特定し、クライアントにアクセスを許可するかどうかを尋ねます(ステップ 7、8、9)。認可コードの発行
ここまでの処理を経て、認可サーバーが次の状態に達したと仮定します。- 認可サーバーはリソース所有者を認証し、
subjectパラメーターの値として Authlete に共有する識別子がtestuser01であることを確定した。 - 認可サーバーはリソース所有者から同意を得た。
/auth/authorization/issue にリクエストを行います。このときのリクエストパラメーターに、subject および /auth/authorization API 応答の ticket の値を含めます(ステップ 10)。
以下の入力欄に、さきほどの /auth/authorization API のレスポンスに含まれていた ticket と、任意の subject の値を入れてください(各タブのコードが更新されます)。
resultMessageは、リクエスト処理の結果を人間が読める形式で提供します(詳細は Authlete の結果コードの解釈 を参照)。actionは、認可サーバーが次に何を行うべきかを示します。この応答ではLOCATIONという値が指定されており、認可サーバーはユーザーエージェントにリダイレクト応答を返す必要があります(詳細は アクションハンドリング を参照)。responseContentは、認可サーバーからの応答内容を表します(詳細は アクションハンドリング を参照)。
/auth/authorization/fail API は、クライアントに送信されるメッセージや応答の転送方法に関する終了プロセスをサポートします。
まとめると、認可サーバーは通常、ユーザー認証および同意の結果に応じて /auth/authorization/issue または /auth/authorization/fail API のいずれかを呼び出します。
トークンリクエスト
ここでは、ユーザーエージェントが認可サーバーからのリダイレクト応答を受信したものと仮定します。その後、以下のようなリクエストがクライアントに送信されます(ステップ 13)。(可読性のため折り返しを追加しています。入力欄の認可コードを入れると下の GET が更新されます。) 以下の入力欄に認可コード(前ステップの応答で得たcode)を入れると、コードが更新されます。
クライアントは code パラメーターの値を抽出し、この値を使用してトークンリクエストを作成し、以下のように認可サーバーに送信します。このチュートリアルでは、https://as.example.com/token をトークンエンドポイント URI と仮定します(ステップ 14)。
認可サーバーはリクエスト内のパラメーターを評価し、その後、クライアントにトークン応答を返します。
このチュートリアルでは、リクエストを評価し、応答を生成するために、Authlete の /auth/token API を使用します。
resultMessageは、リクエスト処理の結果を人間が読める形式で提供します(詳細は Authlete の結果コードの解釈 を参照)。actionは、認可サーバーが次に何を行うべきかを示します。この応答ではOKという値が指定されており、認可サーバーはクライアントにトークン応答を送信する必要があります(詳細は アクションハンドリング を参照)。responseContentには、認可サーバーからの応答内容が含まれています(詳細は アクションハンドリング を参照)。
以上で、認可サーバーはトークンを正常に作成・提供したことになります。このように Authlete API を利用することで、認可およびトークンリクエストのパラメーターを評価するための複雑なロジックを実装することなく、適切な方法で応答する認可サーバーを構築できます。
API リクエスト(トークンイントロスペクション)
通常、クライアントはアクセストークンを使用してリソースサーバーにリクエストを送信し、API にアクセスします(ステップ 18)。リソースサーバーは、トークンの有効性を評価し、トークンに関連付けられたユーザーおよびクライアントに関する情報を取得し、API リクエストへの応答方法を決定します。 Authlete は、この目的のために/auth/introspection API を提供しています。この API はトークンの有効性を検証し、必要な情報を提供します。
リソースサーバーがクライアントからアクセストークンを受け取ったと仮定し、そのアクセストークンを以下の入力欄に設定して、Authlete API を用いたイントロスペクションを実行してみましょう。
- トークンの有効期限(
expiresAt) - アクセスを承認したユーザーの識別子(
subject) - トークンを取得するために使用されたグラントタイプ(
grantType) - クライアント識別子(
clientId)