OAuth アプリは、Project Authentication をサービスの認可サーバーに変えます。サインインしているプロジェクト ユーザーは、アプリにユーザーのパスワードやアップストリーム ソーシャル プロバイダー トークンを与えずに、アプリの明示的なスコープを承認できます。
#OAuth アプリとは
#アプリを登録する
プロジェクトの認証 UI で、名前、クライアント タイプ、ホームページ、正確なリダイレクト URI、および許可されたスコープを追加します。
| クライアント タイプ | 秘密 | PKCE |
|---|---|---|
| パブリック | 展開可能なクライアント シークレットはありません | S256 が必要であるように正規化されます。 |
| 機密 | トークン交換時に必要なクライアント シークレット | サポートおよび推奨 |
クライアント シークレットが 1 回表示されてリクエストを再送信します。ローテーションすると、そのアプリの既存の OAuth トークンが取り消されます。
#認可フロー
GET https://api.agihalo.com/api/v1/auth/oauth/authorize
?client_id=halo_client_...
&redirect_uri=https%3A%2F%2Fservice.example.com%2Fcallback
&scope=profile%20email
&state=opaque-client-stateGET エンドポイントは、クライアント、リダイレクト URI、および要求されたスコープを検証し、同意 UI のアプリの詳細を返します。ユーザーが承認したら、プロジェクト ユーザー アクセス トークンを使用して POST エンドポイントを呼び出します。
curl -X POST https://api.agihalo.com/api/v1/auth/oauth/authorize \
-H "Authorization: Bearer $PROJECT_USER_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"client_id": "halo_client_...",
"redirect_uri": "https://service.example.com/callback",
"scopes": ["profile", "email"],
"state": "opaque-client-state",
"code_challenge": "S256_CHALLENGE",
"code_challenge_method": "S256"
}'応答には redirectToが含まれます。その正確な URL に移動して、サービスが code と元のstateを受信します。
#トークン交換
curl -X POST https://api.agihalo.com/api/v1/auth/oauth/token \
-H "Content-Type: application/json" \
-d '{
"grant_type": "authorization_code",
"client_id": "halo_client_...",
"code": "halo_code_...",
"redirect_uri": "https://service.example.com/callback",
"code_verifier": "ORIGINAL_PKCE_VERIFIER"
}'機密クライアントは client_secretも送信します。認証コードは 1 回限りで、登録されたクライアント、リダイレクト URI、プロジェクト ユーザー、スコープ、およびオプションの S256 チャレンジにバインドされます。
/api/v1/auth/oauth/token認可コードとリフレッシュ トークンの付与。
#ユーザー情報とスコープ
/api/v1/auth/oauth/userinfoOAuthアクセストークンをベアラートークンとして送信します。 HALO は、プロジェクト ユーザー情報を返す前に、プロジェクト、アプリ、対象ユーザー、トークンの使用、ユーザー ステータス、スコープを検証します。