すべてのプロダクト
Search
ドキュメントセンター

Resource Access Management:ネイティブアプリケーションからAlibaba Cloud APIにアクセスする

最終更新日:Oct 31, 2024

このトピックでは、Open Authorization (OAuth) 2.0を使用して、デスクトップアプリケーションやモバイルアプリなどのネイティブアプリケーションからAlibaba Cloud APIにアクセスする方法について説明します。

前提条件

ネイティブアプリケーションが作成されていること。 ネイティブアプリケーションの名前、OAuthスコープ、およびコールバックURLが指定されています。 詳細については、「アプリケーションの作成」をご参照ください。 ネイティブアプリケーションは信頼できない環境で実行されるため、ネイティブアプリケーションはアプリケーションシークレットを使用しません。

説明

ネイティブアプリケーションを作成すると、アプリケーションはAlibaba Cloudアカウント内のAlibaba Cloudリソースにアクセスできます。

処理中

基本流程

  1. ユーザーは、ブラウザを使用してネイティブアプリケーションにログオンします。

  2. ネイティブアプリケーションは、ユーザーをOAuth 2.0サービスにリダイレクトし、アプリケーションのURLをブラウザーに送信します。

    説明

    ユーザーがAlibaba Cloudにログオンしていない場合、ネイティブアプリケーションはユーザーをAlibaba Cloudログオンページにリダイレクトします。

  3. ユーザーはブラウザを使用してOAuth 2.0サービスにログインし、認証コードを要求します。

  4. Alibaba Cloud OAuth 2.0サービスは、ユーザーをネイティブアプリケーションにリダイレクトし、承認コードをブラウザーに返します。

  5. ネイティブアプリケーションは、OAuth 2.0サービスからユーザーに対応するアクセストークンを要求します。 リクエストには承認コードが必要です。

  6. Alibaba Cloud OAuth 2.0サービスは、取得したアクセストークンをネイティブアプリケーションに送信します。

  7. ネイティブアプリケーションは、アクセストークンを使用してAlibaba CloudのAPIにアクセスします。

    説明

    アクセストークンには、ユーザーに関するID情報が含まれており、ネイティブアプリケーションがユーザーのリソースにアクセスするために使用できます。

PKCE

ネイティブアプリケーションでは、PKCE (Proof Key for Code Exchange) 仕様を使用して、認証コードとアクセストークンを取得できます。 詳細については、「OAuthパブリッククライアントによるコード交換の証明キー」をご参照ください。

説明

PKCE仕様は、認証コードに対する傍受攻撃を軽減するために使用することができます。

  1. ネイティブアプリケーションは、code_verifierという名前のランダム文字列作成して記録します。

    説明

    code_verifier文字列は、高エントロピー暗号文字列です。 文字列の長さは43 ~ 128文字で、英数字、ハイフン (-) 、ピリオド (.) 、アンダースコア (_) 、およびチルダ (~) を使用できます。

  2. ネイティブアプリケーションは、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になります。

  3. ネイティブアプリケーションが取得した認可コードを使用してアクセストークンを要求する場合、サーバはcode_verifier文字列に基づいてcode_challenge文字列を計算することによってアクセストークンを発行するかどうかを決定します。

    取得された認証コードには、code_verifier文字列が含まれます。 サーバーは、code_verifier文字列とネイティブアプリケーションによって選択された変換メソッドに基づいて、code_challenge文字列を計算します。 次に、サーバーはcode_challenge文字列をネイティブアプリケーションによって提供されるcode_challenge文字列と比較します。 2つのcode_challenge文字列の値が同じ場合、サーバーは要求されたアクセストークンを発行します。

アクセストークンの取得

  1. ネイティブアプリケーションは、認証コードを取得するためにユーザーを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****                     
  2. ネイティブアプリケーションは、認証コードを使用して、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_tokenid_token パラメーターは含まれません。

リフレッシュトークンの取り消し

ユーザーがネイティブアプリケーションからログアウトした場合、またはネイティブアプリケーションからアカウントを削除した場合は、アプリケーションのリフレッシュトークンを取り消す必要があります。

リフレッシュトークンを取り消すために使用されるエンドポイントは https://oauth.alibabacloud.com/v1/revokeです。

表6リクエストパラメーター

パラメーター

必須

説明

トークン

必須

取り消す更新トークン。

client_id

必須

ネイティブアプリケーションのID。