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設定とアクセストークン取得までの具体的な手続きを紹介します。

前提

本ページ記載の機能及び設定に関する内容は、20234月現在の情報となります。

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]をクリック
Auth0管理画面で、[Applications] > [APIs]をクリック
  • [+Create API]をクリック
[+Create API]をクリック
  • 各項目を設定後、[Create]をクリック
  • Name:任意の名称 例) My API
  • Identifier:APIの識別子 例) api://my-auth0-workshop-api
各項目を設定後、[Create]をクリック
  • 以下URLにアクセスし、Backend/APIの[Node(Express)API]をクリック
  • Express.js API applicationページへ遷移後、[Log in]ボタンをクリック
Express.js API applicationページへ遷移後、[Log in]ボタンをクリック
  • ログイン後、設定対象のAuth0テナントを選択し、ページ内[①Define permissions]の[Download Sample]をクリック
ログイン後、設定対象のAuth0テナントを選択し、ページ内[①Define permissions]の[Download Sample]をクリック
  • ドロップダウンリストから③で作成したAPIを選択し、[DOWNLOAD]をクリック
ドロップダウンリストから③で作成したAPIを選択し、[DOWNLOAD]をクリック
  • ダウンロードしたファイルを任意のフォルダで解凍
  • 解凍したフォルダで以下コマンドを実行し、Backend APIを起動
$ npm install
$ npm start

[補足] 以下のエンドポイントを持つAPIサーバが起動

エンドポイント 説明
/api/public
  • 認可不要で利用可能
/api/private
  • スコープ無しのアクセストークンによるリクエストで利用可能
  • checkJwtミドルウェアによるJWT形式のアクセストークン検証を実施
/api/private-scoped
  • スコープ“read:messages”有りのアクセストークンによるリクエストで利用可能
  • checkJwtミドルウェアによるJWT形式のアクセストークン検証に加えて、checkScopesによるscope検証も実施

API設定におけるPermission定義

  • Auth0管理画面で、[Applications] > [APIs]をクリック
  • 「サンプルを用いたAPIサーバ実現」で作成したAPIを選択後、[Permissions]タブに移動
「サンプルを用いたAPIサーバ実現」で作成したAPIを選択後、[Permissions]タブに移動
  • 各項目を設定後、[+Add]をクリック
  • Permission (Scope):例) read:messages
  • Description:任意の説明文 例) read messages
各項目を設定後、[+Add]をクリック

M2Mアプリ向けApplication設定

  • Auth0管理画面で、[Applications] > [Applications]をクリック
  • Applicationを新規作成
  • [Machine to Machine Applications]を選択し、[Create]をクリック
Applicationを新規作成
  • 作成後、払い出されたClient IDとClient Secret値を確認
作成後、払い出されたClient IDとClient Secret値を確認
  • 「サンプルを用いたAPIサーバ実現」で作成したAPIを選択し、「API設定におけるPermission定義」で作成したPermissionにチェックを入れ、[Authorize]をクリック
「サンプルを用いた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 担当

月~金 8:45~17:30