パーソナルアクセストークン (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) でもアクセスパターンや権限は同じです。
リクエスト
トークンエクスチェンジグラントを使用する前に、アプリケーションで有効化する必要があります:
- コンソール > アプリケーション に移動し、対象のアプリケーションを選択します。
- アプリケーション設定で「トークンエクスチェンジ」セクションを探します。
- 「トークンエクスチェンジを許可する」トグルを有効にします。
セキュリティ上の理由から、トークンエクスチェンジはデフォルトで無効になっています。有効化しない場合、「このアプリケーションではトークンエクスチェンジは許可されていません」というエラーが返されます。
アプリケーションは、HTTP POST メソッドを使い、特別な grant type でテナントの トークンエンドポイント へ トークンエクスチェンジリクエスト を送信します。HTTP リクエストのエンティティボディには application/x-www-form-urlencoded 形式で次のパラメーターを含めます。
client_id: 必須。アプリケーションのクライアント ID。grant_type: 必須。このパラメーターの値はurn:ietf:params:oauth:grant-type:token-exchangeで、トークンエクスチェンジを実行することを示します。resource: 任意。リソースインジケーター。他のトークンリクエストと同様です。scope: 任意。リクエストするスコープ。他のトークンリクエストと同様です。subject_token: 必須。ユーザーの PAT。subject_token_type: 必須。subject_tokenパラメーターで提供されるセキュリティトークンのタイプ。このパラメーターの値はurn:logto:token-type:personal_access_tokenでなければなりません。
レスポンス
トークンエクスチェンジリクエストが成功すると、テナントのトークンエンドポイントはユーザーのアイデンティティを表すアクセス トークン (Access token) を返します。レスポンスには、HTTP レスポンスのエンティティボディに application/json 形式で次のパラメーターが含まれます。
access_token: 必須。ユーザーのアクセス トークン (Access token)。authorization_codeやrefresh_tokenなど他のトークンリクエストと同じです。issued_token_type: 必須。発行されたトークンのタイプ。このパラメーターの値はurn:ietf:params:oauth:token-type:access_tokenでなければなりません。token_type: 必須。トークンのタイプ。このパラメーターの値はBearerでなければなりません。expires_in: 必須。アクセス トークン (Access token) の有効期間(秒単位)。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 キーの定義と実際の利用シナリオ