Okta
オクタ
はじめに
Auth0では、OAuth2.0(RFC6749)/OpenID Connect 1.0で定義されている「Authorization Code Flow」「Implicit Flow」や「Client Credentials Flow」など、各種認証認可フローに対応しています。Auth0やAuth0で提供されるSDKを利用すると、各フローを簡単に実装できます。
本ページでは、Client Credentials Flow(RFC6749 4.4)を例として、Auth0利用時におけるシーケンスを解説します。解説にあたり、必要となるAuth0設定とアクセストークン取得までの具体的な手続きを紹介します。
前提
本ページ記載の機能及び設定に関する内容は、2023年4月現在の情報となります。
Auth0におけるClient Credentials Flow
Auth0におけるClient Credentials Flowのシーケンスは、以下の通りです。
- M2Mアプリ:M2MアプリのクライアントID及びクライアントシークレットをAuth0 /oauth/token(トークン取得のエンドポイント)へ送信
- Auth0:M2MアプリのクライアントID及びクライアントシークレットを検証
- Auth0:アクセストークンを応答
- M2Mアプリ:アクセストークンを使用して、APIサーバのエンドポイントに対して情報を要求
- API:アクセストークンの検証、要求された情報を応答
事前設定
上記シーケンスの確認にあたり、必要な事前設定を行います。
サンプルを用いたAPIサーバ実現
- Auth0管理画面で、[Applications] > [APIs]をクリック
- [+Create API]をクリック
- 各項目を設定後、[Create]をクリック
- Name:任意の名称 例) My API
- Identifier:APIの識別子 例) api://my-auth0-workshop-api
- 以下URLにアクセスし、Backend/APIの[Node(Express)API]をクリック
- Express.js API applicationページへ遷移後、[Log in]ボタンをクリック
- ログイン後、設定対象のAuth0テナントを選択し、ページ内[①Define permissions]の[Download Sample]をクリック
- ドロップダウンリストから③で作成したAPIを選択し、[DOWNLOAD]をクリック
- ダウンロードしたファイルを任意のフォルダで解凍
- 解凍したフォルダで以下コマンドを実行し、Backend APIを起動
$ npm install $ npm start
[補足] 以下のエンドポイントを持つAPIサーバが起動
エンドポイント | 説明 |
/api/public |
|
/api/private |
|
/api/private-scoped |
|
API設定におけるPermission定義
- Auth0管理画面で、[Applications] > [APIs]をクリック
- 「サンプルを用いたAPIサーバ実現」で作成したAPIを選択後、[Permissions]タブに移動
- 各項目を設定後、[+Add]をクリック
- Permission (Scope):例) read:messages
- Description:任意の説明文 例) read messages
M2Mアプリ向けApplication設定
- Auth0管理画面で、[Applications] > [Applications]をクリック
- Applicationを新規作成
- [Machine to Machine Applications]を選択し、[Create]をクリック
- 作成後、払い出されたClient IDとClient Secret値を確認
- 「サンプルを用いたAPIサーバ実現」で作成したAPIを選択し、「API設定におけるPermission定義」で作成したPermissionにチェックを入れ、[Authorize]をクリック
確認手順
Auth0におけるClient Credentials Flowのシーケンスを確認します。確認手順の概要は、以下の通りです。
- Auth0 /oauth/tokenエンドポイントにアクセスし、アクセストークンを取得
- 取得したアクセストークンを確認
- 取得したアクセストークンを利用してAPIサーバのエンドポイントへリクエスト
確認手順詳細
1. Auth0 /oauth/tokenエンドポイントにアクセスし、アクセストークンとIDトークンを取得
> curl -X POST --url 'https://<YOUR_AUTH0_TENANT_NAME>.<REGION_DOMAIN>.auth0.com/oauth/token' --header 'content-type: application/x-www-form-urlencoded' --data 'grant_type=client_credentials&client_id=Ut1Qju59VdHiWDA8H0OPg6MUN2e6b6fK&client_secret=nxq5C8mQzuVm1HnctggiqirlCgH5P3s62jPJR9FYMi2W7I-NpfSJltzkHI0AQ76x&audience=api://my-auth0-workshop-api'
補足
- grant_type=client_credentials:Client Credentials Flow利用
- client_id:事前設定におけるApplication設定のClient ID
- client_secret:事前設定におけるApplication設定のClient Secret
- audience:APIサーバURL(API設定におけるIdentifier)
取得結果
{
"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6Ikp...(略)...Y41x_ubpdQw8dCD8AA",
"scope":"read:messages",
"expires_in":86400,
"token_type":"Bearer“
}
2. 取得したアクセストークンを確認
jwt.ioにてアクセストークンをデコード
アクセストークンのデコード結果
{ "iss": "https://. .auth0.com/", "sub": "Ut1Qju59VdHiWDA8H0OPg6MUN2e6b6fK@clients", "aud": "api://my-auth0-workshop-api", "iat": 1677818643, "exp": 1677905043, "azp": "Ut1Qju59VdHiWDA8H0OPg6MUN2e6b6fK", "scope": "read:messages", "gty": "client-credentials" }
3. 取得したアクセストークンを利用してAPIサーバのエンドポイントへリクエスト
APIサーバの/api/private-scopedエンドポイントに対してリクエスト
> curl --request GET "http://localhost:3010/api/private-scoped" --header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6Ikp...(略)...Y41x_ubpdQw8dCD8AA' --header 'Content-Type: application/json'
取得結果(以下のメッセージが返されることを確認)
{ "message":"Hello from a private endpoint! You need to be authenticated and have a scope of read:messages to see this." }
おわりに
Auth0におけるClient Credentials Flowの動きとして、アクセストークンの発行からAPIサーバへのアクセスまでをご紹介しました。Client Credentials Flowの動きとAuth0による実装の理解に役立てていただければ幸いです。
参考
お問い合わせ・資料請求
株式会社マクニカ Okta 担当
- TEL:045-476-2010
- E-mail:okta@macnica.co.jp
平日 9:00~17:00