本トピックでは、Proof Key for Code Exchange(PKCE)を用いた OAuth 2.0 認証コードフローを使用して、デスクトップアプリやモバイルアプリなどのネイティブアプリが、ユーザーに代わって Alibaba Cloud API に安全にアクセスできるようにする方法について説明します。
前提条件
Resource Access Management (RAM) コンソールで OAuth 2.0 ネイティブアプリを作成済みであり、リダイレクト URI を指定済みである必要があります。
アプリケーションの ID を安全に保管済みである必要があります。ネイティブアプリではクライアントシークレットは使用しません。
権限付与フローの概要
PKCE を用いた認証コードフローは、ネイティブアプリに対して推奨され、最もセキュアな方法です。この手法は、認証コードの盗聴攻撃を防止するための追加セキュリティレイヤーを提供します。
code_verifier および code_challenge の生成:ネイティブアプリが高エントロピーのランダム文字列(
code_verifier)と、その変換後の文字列(code_challenge)を生成します。ユーザーによるログイン開始:アプリケーションがブラウザを開き、Alibaba Cloud 権限付与エンドポイントへ移動し、
code_challengeおよびその変換方式を渡します。ユーザーによる同意の付与:ユーザーが Alibaba Cloud アカウントにログインし、アプリケーションが要求した権限を付与します。
認証コードの受信:権限付与サーバーが、1 回限りの使用可能な認証コードを含むリダイレクト URL へユーザーをアプリケーションの指定されたリダイレクト先へ戻します。
認証コードをトークンと交換:アプリケーションが Alibaba Cloud トークンエンドポイントへリクエストを送信し、認証コードおよび元の
code_verifierをアクセストークンおよび更新トークンと交換します。サーバーは、最初のステップで受け取ったcode_challengeと照合するためにcode_verifierを検証します。保護されたリソースへのアクセス:アプリケーションがアクセストークンを使用して、Alibaba Cloud サービスに対する承認済みの API 呼び出しを行います。
ステップ 1:PKCE を用いた認証コードのリクエスト
フローを開始するには、まずアプリケーションが PKCE パラメーターを生成し、次にユーザーを権限付与エンドポイントへリダイレクトする必要があります。
1. PKCE パラメーターの生成
まず、アプリケーションが 43 文字以上 128 文字以下の高エントロピー暗号化ランダム文字列(code_verifier)を作成・記録します。
次に、以下のいずれかの方式を用いて code_verifier を変換し、code_challenge を作成します。
変換方式 | 説明 |
|
|
| (推奨) |
S256 を用いた例:
code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXkcode_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
2. 権限付与エンドポイントへのリダイレクト
アプリケーションは、以下のパラメーターを含むシステムブラウザを開き、Alibaba Cloud 権限付与エンドポイント(https://signin.alibabacloud.com/oauth2/v1/auth)へ移動します。
パラメーター | 必須 | 説明 |
client_id | はい | ご利用のネイティブアプリの ID です。 |
redirect_uri | はい | ユーザーが同意を付与した後にリダイレクトされる URI です。これは、ご利用のアプリケーションに登録済みの URI のいずれかと完全に一致する必要があります。 |
response_type | はい |
|
scope | いいえ | アプリケーションが要求する OAuth スコープをスペース区切りで並べたリストです。省略した場合、アプリケーションに設定済みのすべてのスコープが要求されます。 |
state | いいえ | リクエストとコールバック間の状態を維持するための不透明な値です。クロスサイトリクエストフォージェリ(CSRF)攻撃を防止するため、ランダムかつ予測不能な文字列を使用することを強く推奨します。 |
code_challenge_method | いいえ | 使用される変換方法。有効な値: デフォルト値: |
code_challenge | いいえ | 生成した 説明 このパラメーターを省略すると PKCE は使用されず、認証コードの盗聴攻撃に対して脆弱になります。この場合、攻撃者が認証コードを傍受してアクセストークンと交換することが可能です。 |
prompt | いいえ | ユーザーが以前に要求された権限を付与済みであっても、権限付与サーバーが同意画面を表示するよう強制するには、このパラメーターを |
リクエスト例
https://signin.alibabacloud.com/oauth2/v1/auth?
client_id=98989****
&redirect_uri=meeting%3A%2F%2Fauthorize%2F
&response_type=code
&scope=openid%20%2Fworksuite%2Fuseraccess
&state=123456****
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSst****
&code_challenge_method=S256応答例
ユーザーが同意を付与した場合、権限付与サーバーは、認証コードおよび state をクエリパラメーターとして付加した状態で、ユーザーのブラウザをご利用の redirect_uri へリダイレクトします。
GET HTTP/1.1 302 Found
Location: meeting://authorize/?code=ABAFDGDFXYZW888&state=123456**** ステップ 2:認証コードをアクセストークンと交換
アプリケーションが認証コードを受信した後、バックエンドサーバーから Alibaba Cloud トークンエンドポイント(https://oauth.alibabacloud.com/v1/token)へ POST リクエストを送信し、認証コードをトークンと交換する必要があります。
リクエストパラメーター(POST ボディ)
パラメーター | 必須 | 説明 |
code | はい | ステップ 1 で受信した認証コードです。 |
client_id | はい | ご利用のネイティブアプリの ID です。 |
redirect_uri | はい | ステップ 1 のリクエストで使用したのと同じリダイレクト URI です。 |
grant_type | はい |
|
code_verifier | いいえ | ステップ 1 で生成した元の |
リクエスト例
POST /v1/token HTTP/1.1
Host: oauth.alibabacloud.com
Content-Type: application/x-www-form-urlencoded
code=ABAFDGDFXYZW888&
client_id=98989****
redirect_uri=meeting://authorize/&
grant_type=authorization_code&
code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk 応答例
リクエストが成功した場合、トークンエンドポイントはトークンを含む JSON オブジェクトを返します。
{
"access_token": "eyJraWQiOiJrMTIzNCIsImVuYyI6****",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "Ccx63VVeTn2dxV7ovXXfLtAqLLERA****",
"id_token": "eyJhbGciOiJIUzI1****"
} ステップ 3(任意):アクセストークンの更新
更新トークンを使用することで、ユーザーが再度ログインすることなく新しいアクセストークンを取得できます。エンドポイント: https://oauth.alibabacloud.com/v1/token
リクエストパラメーター(POST ボディ)
パラメーター | 必須 | 説明 |
refresh_token | はい | 以前に受信した更新トークンです。 |
client_id | はい | ご利用のネイティブアプリの ID です。 |
grant_type | はい |
|
リクエスト例
POST /v1/token HTTP/1.1
Host: oauth.alibabacloud.com
Content-Type: application/x-www-form-urlencoded
refresh_token=Ccx63VVeTn2dxV7ovXXfLtAqLLERAH****
client_id=98989****
grant_type=refresh_token応答例
トークンエンドポイントは新しいアクセストークンを返します。
{
"access_token": "eyJraWQiOiJrMTIzNCIsImVuYyI6****",
"token_type": "Bearer",
"expires_in": 3600,
} 更新トークンの取り消し
ユーザーがアプリケーションからログアウトする場合、またはアカウントの連携を解除する場合、関連する更新トークンを取り消して無効化する必要があります。
エンドポイント: https://oauth.alibabacloud.com/v1/revoke
リクエストパラメーター(POST ボディ)
パラメーター | 必須 | 説明 |
token | はい | 取り消す更新トークンです。 |
client_id | はい | ご利用のネイティブアプリの ID です。 |
正常なリクエストの場合、HTTP 200 OK ステータスが返されます。