メインコンテンツまでスキップ

パーソナルアクセストークン (Personal access token)

パーソナルアクセストークン (PAT) は、ユーザーが認証情報やインタラクティブなサインインを使用せずに アクセス トークン (Access token) を安全に付与する方法を提供します。これは、CI / CD、スクリプト、またはリソースへプログラム的にアクセスする必要があるアプリケーションに便利です。

パーソナルアクセストークンの管理

コンソールを使用する場合

コンソール > ユーザー管理 のユーザー詳細ページでパーソナルアクセストークンを管理できます。「認証 (Authentication)」カードで、パーソナルアクセストークンの一覧を確認したり、新規作成したりできます。

Management API を使用する場合

Management API をセットアップした後、API エンドポイント を利用してパーソナルアクセストークンの作成、一覧取得、削除が可能です。

PAT を使ってアクセス トークン (Access tokens) を付与する

PAT を作成した後、トークンエクスチェンジエンドポイントを利用してアプリケーションにアクセス トークン (Access token) を付与できます。

トークンフローの等価性:

PAT を使用して取得したアクセス トークン (Access token) は、標準の refresh_token フローで取得したトークンと同一の動作をします。つまり:

  • 組織コンテキスト:PAT で取得したトークンは、リフレッシュ トークン (Refresh token) フローと同じ組織権限やスコープをサポートします
  • 認可フロー:PAT で交換したアクセス トークン (Access token) は 組織権限組織レベルの API リソース に利用できます
  • トークン検証:同じ検証ロジックが適用されます - 初期の grant type だけが異なります

組織を扱う場合、PAT でもリフレッシュ トークン (Refresh token) でもアクセスパターンや権限は同じです。

リクエスト

前提条件:

トークンエクスチェンジグラントを使用する前に、アプリケーションで有効化する必要があります:

  1. コンソール > アプリケーション に移動し、対象のアプリケーションを選択します。
  2. アプリケーション設定で「トークンエクスチェンジ」セクションを探します。
  3. 「トークンエクスチェンジを許可する」トグルを有効にします。

セキュリティ上の理由から、トークンエクスチェンジはデフォルトで無効になっています。有効化しない場合、「このアプリケーションではトークンエクスチェンジは許可されていません」というエラーが返されます。

アプリケーションは、HTTP POST メソッドを使い、特別な grant type でテナントの トークンエンドポイントトークンエクスチェンジリクエスト を送信します。HTTP リクエストのエンティティボディには application/x-www-form-urlencoded 形式で次のパラメーターを含めます。

  1. client_id: 必須。アプリケーションのクライアント ID。
  2. grant_type: 必須。このパラメーターの値は urn:ietf:params:oauth:grant-type:token-exchange で、トークンエクスチェンジを実行することを示します。
  3. resource: 任意。リソースインジケーター。他のトークンリクエストと同様です。
  4. scope: 任意。リクエストするスコープ。他のトークンリクエストと同様です。
  5. subject_token: 必須。ユーザーの PAT。
  6. subject_token_type: 必須。subject_token パラメーターで提供されるセキュリティトークンのタイプ。このパラメーターの値は urn:logto:token-type:personal_access_token でなければなりません。

レスポンス

トークンエクスチェンジリクエストが成功すると、テナントのトークンエンドポイントはユーザーのアイデンティティを表すアクセス トークン (Access token) を返します。レスポンスには、HTTP レスポンスのエンティティボディに application/json 形式で次のパラメーターが含まれます。

  1. access_token: 必須。ユーザーのアクセス トークン (Access token)。authorization_coderefresh_token など他のトークンリクエストと同じです。
  2. issued_token_type: 必須。発行されたトークンのタイプ。このパラメーターの値は urn:ietf:params:oauth:token-type:access_token でなければなりません。
  3. token_type: 必須。トークンのタイプ。このパラメーターの値は Bearer でなければなりません。
  4. expires_in: 必須。アクセス トークン (Access token) の有効期間(秒単位)。
  5. scope: 任意。アクセス トークン (Access token) のスコープ。

トークンエクスチェンジの例

従来の Web アプリケーションやアプリシークレットを持つマシン間通信アプリケーションの場合、Authorization ヘッダーに HTTP Basic 認証で認証情報を含めます:

POST /oidc/token HTTP/1.1
Host: tenant.logto.app
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <base64(app-id:app-secret)>

grant_type=urn:ietf:params:oauth:grant-type:token-exchange
&resource=http://my-api.com
&scope=read
&subject_token=pat_W51arOqe7nynW75nWhvYogyc
&subject_token_type=urn:logto:token-type:personal_access_token

シングルページアプリケーション (SPA) やアプリシークレットを持たないネイティブアプリケーションの場合、リクエストボディに client_id を含めます:

POST /oidc/token HTTP/1.1
Host: tenant.logto.app
Content-Type: application/x-www-form-urlencoded

client_id=your-app-id
&grant_type=urn:ietf:params:oauth:grant-type:token-exchange
&resource=http://my-api.com
&scope=read
&subject_token=pat_W51arOqe7nynW75nWhvYogyc
&subject_token_type=urn:logto:token-type:personal_access_token

成功時のレスポンス例:

HTTP/1.1 200 OK
Content-Type: application/json

{
"access_token": "eyJhbGci...zg",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "read"
}

その後、JWT デコーダー でアクセス トークン (Access token) をデコードすると、次のようなアクセス トークン (Access token) ペイロードが得られます:

{
"jti": "VovNyqJ5_tuYac89eTbpF",
"sub": "rkxl1ops7gs1",
"iat": 1756908403,
"exp": 1756912003,
"scope": "read",
"client_id": "your-app-id",
"iss": "https://tenant-id.logto.app/oidc",
"aud": "http://my-api.com"
}

パーソナルアクセストークンとは?どんなときにパーソナルアクセストークンを使うべき?

パーソナルアクセストークン、マシン間通信認証 (Machine-to-Machine authentication)、API キーの定義と実際の利用シナリオ