このトピックでは、Open Authorization (OAuth) 2.0を使用して、デスクトップアプリケーションやモバイルアプリなどのネイティブアプリケーションからAlibaba Cloud APIにアクセスする方法について説明します。
前提条件
ネイティブアプリケーションが作成されていること。 ネイティブアプリケーションの名前、OAuthスコープ、およびコールバックURLが指定されています。 詳細については、「アプリケーションの作成」をご参照ください。 ネイティブアプリケーションは信頼できない環境で実行されるため、ネイティブアプリケーションはアプリケーションシークレットを使用しません。
ネイティブアプリケーションを作成すると、アプリケーションはAlibaba Cloudアカウント内のAlibaba Cloudリソースにアクセスできます。
処理中
ユーザーは、ブラウザを使用してネイティブアプリケーションにログオンします。
ネイティブアプリケーションは、ユーザーをOAuth 2.0サービスにリダイレクトし、アプリケーションのURLをブラウザーに送信します。
説明ユーザーがAlibaba Cloudにログオンしていない場合、ネイティブアプリケーションはユーザーをAlibaba Cloudログオンページにリダイレクトします。
ユーザーはブラウザを使用してOAuth 2.0サービスにログインし、認証コードを要求します。
Alibaba Cloud OAuth 2.0サービスは、ユーザーをネイティブアプリケーションにリダイレクトし、承認コードをブラウザーに返します。
ネイティブアプリケーションは、OAuth 2.0サービスからユーザーに対応するアクセストークンを要求します。 リクエストには承認コードが必要です。
アクセストークンの取得方法の詳細については、「アクセストークンの取得」をご参照ください。
新しいアクセストークンを取得する方法の詳細については、「新しいアクセストークンの取得」をご参照ください。
更新トークンを取り消す方法の詳細については、「更新トークンの取り消し」をご参照ください。
Alibaba Cloud OAuth 2.0サービスは、取得したアクセストークンをネイティブアプリケーションに送信します。
ネイティブアプリケーションは、アクセストークンを使用してAlibaba CloudのAPIにアクセスします。
説明アクセストークンには、ユーザーに関するID情報が含まれており、ネイティブアプリケーションがユーザーのリソースにアクセスするために使用できます。
PKCE
ネイティブアプリケーションでは、PKCE (Proof Key for Code Exchange) 仕様を使用して、認証コードとアクセストークンを取得できます。 詳細については、「OAuthパブリッククライアントによるコード交換の証明キー」をご参照ください。
PKCE仕様は、認証コードに対する傍受攻撃を軽減するために使用することができます。
ネイティブアプリケーションは、
code_verifier
という名前のランダム文字列作成して記録します。説明code_verifier
文字列は、高エントロピー暗号文字列です。 文字列の長さは43 ~ 128文字で、英数字、ハイフン (-) 、ピリオド (.) 、アンダースコア (_) 、およびチルダ (~)
を使用できます。ネイティブアプリケーションは、code_verifier文字列と選択された
transformation
メソッドに基づいてcode_challenge
文字列を作成します。 次に、ネイティブアプリケーションは、認証コードを取得する要求を送信する。code_challenge
文字列と、code_challenge
文字列を作成するための変換メソッドをリクエストに含める必要があります。code_challenge = transform(code_verifier, [Plain|S256])
変換方法
値
プレーン
transformation
メソッドがplain
の場合、code_challenge
文字列の値はcode_verifier
文字列の値と同じです。S256
transformation
メソッドがS256
の場合、code_challenge
文字列の値は、code_verifier
文字列のSHA-256ハッシュ値と同じです。code_challenge=BASE64URL-Encode(SHA256(ASCII(code_verifier)))
説明ハッシュアルゴリズムの入力は、
code_verifier
のASCIIエンコードされた文字列です。 ハッシュアルゴリズムの出力は、Base64URLを使用してエンコードする必要があります。次のセクションでは、
code_challenge
文字列の計算方法の例を示します。S256変換メソッドが使用され、
code_verifier
文字列の値がdBjftJeZ4CVP-mB92K27uhbUJU1p1rの場合、code_challenge
文字列の値はE9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cMになります。ネイティブアプリケーションが取得した認可コードを使用してアクセストークンを要求する場合、サーバはcode_verifier文字列に基づいてcode_challenge文字列を計算することによってアクセストークンを発行するかどうかを決定します。
取得された認証コードには、
code_verifier
文字列が含まれます。 サーバーは、code_verifier
文字列とネイティブアプリケーションによって選択された変換メソッドに基づいて、code_challenge
文字列を計算します。 次に、サーバーはcode_challenge文字列をネイティブアプリケーションによって提供されるcode_challenge
文字列と比較します。 2つのcode_challenge文字列の値が同じ場合、サーバーは要求されたアクセストークンを発行します。
アクセストークンの取得
ネイティブアプリケーションは、認証コードを取得するためにユーザーをOAuth 2.0サービスにリダイレクトします。
認証コードの取得に使用されるエンドポイントは
https://signin.alibabacloud.com/oauth2/v1/auth
です。表1リクエストパラメーター
パラメーター
必須
説明
client_id
必須
ネイティブアプリケーションのID。
redirect_uri
必須
ネイティブアプリケーションのリダイレクトURI (Uniform Resource Identifier) 。
response_type
必須
応答のタイプ。 値をcodeに設定します。
スコープ
選択可能
OAuth スコープのスペース区切りのリスト。 このパラメーターを空のままにすると、ネイティブアプリケーションはすべてのスコープへのアクセスを要求します。
state
選択可能
リクエストとレスポンスの両方で使用される値。 stateパラメーターをnonceとして設定して、CSRF (cross-site request forgery) 攻撃を防止したり、ネイティブアプリケーションとOAuth 2.0サービスの間で状態を保持したりできます。 このパラメーターをランダムな文字列に設定した場合、Alibaba Cloud OAuth 2.0サービスは、その後の使用のために応答でstateの値を返します。
code_challenge_メソッド
選択可能
変換方法。 このパラメーターを空のままにすると、デフォルトのメソッドplainが使用されます。
code_challenge
選択可能
このパラメーターは、ネイティブアプリケーションからのPKCE仕様に基づいて認証コードの許可を保護するために使用されます。 このパラメーターは、code_challenge_methodパラメーターの値に基づいてcode_verifier文字列をトランスコードおよびエンコードすることによって生成されます。
説明このパラメーターを空のままにすると、PKCE仕様を使用できなくなり、ネイティブアプリケーションが承認コードを使用してアクセストークンを要求するときにcode_verifier文字列を指定する必要はありません。 別のアプリケーションが許可コードを傍受した場合、アプリケーションはこのコードを使用してアクセストークンを要求できます。
プロンプト
選択可能
サーバーがユーザーにwebアプリケーションに必要な権限を付与するよう求める必要があるかどうかを指定します。
このパラメーターを指定した場合、ユーザーはwebアプリケーションに必要な権限を付与する必要があります。 Alibaba Cloudアカウントがwebアプリケーションに必要な権限をすでに付与している場合でも、ユーザーはwebアプリケーションに必要な権限を付与する必要があります。 このパラメーターを空のままにした場合、Alibaba Cloudアカウントが初めてwebアプリケーションを使用するときに、webアプリケーションに必要な権限を付与する必要があるのはAlibaba Cloudアカウントだけです。
値を
admin_consent
に設定します。 この値は、サーバーが要求された認証コードをクライアントに返す前に、サーバーが認証ページを表示することを指定します。リクエストの例
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
レスポンスの例
GET HTTP/1.1 302 Found Location: meeting://authorize/?code=ABAFDGDFXYZW888&state=123456****
ネイティブアプリケーションは、認証コードを使用して、OAuth 2.0サービスからユーザーに対応するアクセストークンを要求します。
アクセストークンの要求に使用されるエンドポイントは
https://oauth.alibabacloud.com/v1/token
です。表2リクエストパラメーター
パラメーター
必須
説明
コード
必須
ネイティブアプリケーションによって取得される認証コード。
client_id
必須
ネイティブアプリケーションのID。
redirect_uri
必須
承認コードを取得するために使用されるURI。
grant_type
必須
値をauthorization_codeに設定します。
コード_verifier
選択可能
認証コードのリクエストでcode_challenge文字列を作成するために使用するcode_verifier文字列。
リクエストの例
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
表3応答パラメーター
パラメーター
説明
access_token
返されるアクセストークン。 ネイティブアプリケーションは、アクセストークンを使用してAlibaba Cloud APIにアクセスできます。
expires_in
アクセストークンの残りの有効期間。 単位は秒です。
token_type
アクセストークンのタイプ。 値はBearerです。
id_token
ID トークン。 値はJSON Webトークン (JWT) です。 認証コードを取得するために開始されたリクエストのscopeパラメーターの値にopenidが含まれている場合、IDトークンが返されます。
refresh_token
リフレッシュトークン。 ネイティブアプリケーションは、元のアクセストークンを指定する必要なく、リフレッシュトークンを使用して新しいアクセストークンを取得できます。
レスポンスの例
{ "access_token": "eyJraWQiOiJrMTIzNCIsImVuYyI6****", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "Ccx63VVeTn2dxV7ovXXfLtAqLLERA****", "id_token": "eyJhbGciOiJIUzI1****" }
新しいアクセストークンの取得
アクセストークンの要求に使用されるエンドポイントは https://oauth.alibabacloud.com/v1/token
です。
表4リクエストパラメーター
パラメーター | 必須 | 説明 |
refresh_token | 必須 | 許可コードを使用して取得されたリフレッシュトークン。 |
client_id | 必須 | ネイティブアプリケーションのID。 |
grant_type | 必須 | 値をrefresh_tokenに設定します。 |
リクエストの例
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
表5応答パラメーター
パラメーター | 説明 |
access_token | 新しいアクセストークン。 ネイティブアプリケーションは、新しいアクセストークンを使用してAlibaba Cloud APIにアクセスできます。 |
expires_in | アクセストークンの残りの有効期間。 単位は秒です。 |
token_type | アクセストークンのタイプ。 値はBearerです。 |
レスポンスの例
{
"access_token": "eyJraWQiOiJrMTIzNCIsImVuYyI6****",
"token_type": "Bearer",
"expires_in": 3600,
}
この応答の値は、前のサンプル応答の値と同じです。 このレスポンスには、refresh_token と id_token パラメーターは含まれません。
リフレッシュトークンの取り消し
ユーザーがネイティブアプリケーションからログアウトした場合、またはネイティブアプリケーションからアカウントを削除した場合は、アプリケーションのリフレッシュトークンを取り消す必要があります。
リフレッシュトークンを取り消すために使用されるエンドポイントは https://oauth.alibabacloud.com/v1/revoke
です。
表6リクエストパラメーター
パラメーター | 必須 | 説明 |
トークン | 必須 | 取り消す更新トークン。 |
client_id | 必須 | ネイティブアプリケーションのID。 |