as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
AWS
ドキュメント
Support
Contact Us
My Cases
開発
テスト
公開
収益化
ユーザーエンゲージメント
デバイスの仕様
リソース

クイック定期購入のワンクリックアカウント情報共有

クイック定期購入のワンクリックアカウント情報共有

ワンクリックアカウント情報共有では、ユーザーが最小限の労力でAmazonアカウントの情報をアプリと共有でき、手動でアカウントの詳細を入力する必要がありません。この機能により、ユーザーの登録エクスペリエンスが向上します。アプリでワンクリックアカウント情報共有機能を設定するには、以下のガイドを使用してください。

アプリのマニフェストの更新

アプリがクイック定期購入のワンクリックアカウント情報共有機能をサポートしていることをAmazonアプリストアに示すには、アプリのマニフェストを更新して、次のコードを追加します。

<uses-feature android:name="amazon.lwa.quicksignup.supported"/>

セキュリティプロファイルの構成

ワンクリックアカウント情報共有を正しく動作させるには、アプリのセキュリティプロファイルを設定する必要があります。セキュリティプロファイルは、Amazonから開発者に安全にユーザーデータを共有することを可能にし、開発者が自動的にアカウントを作成してユーザーをサインインできるようにするために不可欠なものです。

セキュリティプロファイルにより、セキュリティ認証情報を含むAmazonデータを1つ以上のアプリに関連付けることができます。たとえば、「マイゲーム - 無料」と「マイゲーム - HD」という2つのアプリがある場合に、同じセキュリティプロファイルを使用してデータを共有できます。セキュリティプロファイルには、アプリまたはアプリファミリーを識別できる名前を付けてください。詳細については、セキュリティプロファイルを参照してください。

アプリのセキュリティプロファイルを構成するには

  1. 開発者コンソールのダッシュボードに移動してアカウントにログインします。
  2. [アプリ&サービス] > [マイアプリ] を選択し、アプリを選択します。
  3. [アプリサービス] をクリックし、[セキュリティプロファイル] セクションまでスクロールします。
  4. [既存のセキュリティプロファイルを選択、または新規作成する] をクリックしてオプションを展開します。
  5. ドロップダウンを使用して、このアプリにマップするセキュリティプロファイルを選択し、[セキュリティプロファイルを有効化] をクリックします。

    または、[セキュリティプロファイルを作成] をクリックして新しいセキュリティプロファイルを作成することもできます。新しいセキュリティプロファイルを作成する場合は、すべての必須フィールドに入力し、[Save] をクリックします。

セキュリティプロファイルが正常に関連付けられると、[セキュリティプロファイル] セクションに成功メッセージが表示され、関連付けられたプロファイルの詳細が表示されます。

getUserDataによる変更を実装する

ユーザーがAmazonアカウントの詳細をアプリと共有することに明示的に同意したかどうかを判断するには、アプリの初期化時に次のプロセスを実装する必要があります。

アプリのメインアクティビティのonResume()メソッドで、次の処理を行います。

  • 新しいUserDataRequestオブジェクト(英語のみ)を作成し、ユーザーのプロフィール同意ステータス情報をリクエストするように構成します。同意ステータスをリクエストするようにUserDataRequestオブジェクト(英語のみ)を構成するには、setFetchUserProfileAccessConsentStatus()メソッド(英語のみ)をtrueに設定します。
  • getUserData()メソッド(英語のみ)を呼び出し、構成したUserDataRequestオブジェクト(英語のみ)を渡します。

次の例は、UserDataRequestオブジェクト(英語のみ)を作成してgetUserData()(英語のみ)に渡す方法を示しています。

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    //...

    // 登録するPurchasingListenerの参照を渡します。
    PurchasingService.registerListener(this.getApplicationContext(), purchasingListener);

    // 登録するUserProfileAccessListenerの参照を渡します
    PurchasingService.registerUserProfileAccessListener(this.getApplicationContext(), userProfileAccessListener);

    //...
}

@Override
protected void onResume()
{
    super.onResume();

    //...

    // isLoggedIn()内には、ユーザーのログインステータスを特定するロジックを実装します。
    if (!isLoggedIn()) {
        PurchasingService.getUserData(UserDataRequest.newBuilder().setFetchUserProfileAccessConsentStatus(true).build());
    }

    //...
}

onUserDataResponse()コールバックメソッド(英語のみ)を実装して、ユーザーの同意データを含むUserDataResponseオブジェクト(英語のみ)を取得します。次のコードは、UserDataResponseオブジェクト(英語のみ)から受け取った同意データを処理する方法を示しています。

@Override
public void onUserDataResponse(final UserDataResponse response) {

    UserDataResponse.RequestStatus status = response.getRequestStatus();

    switch (status) {
        case SUCCESSFUL:
            if (UserProfileAccessConsentStatus.CONSENTED.equals(response.getUserData().getUserProfileAccessConsentStatus())) {
                // カスタムローダー画面またはスピナーを起動します。
                PurchasingService.requestUserProfileAccess();
            }
            break;

        case FAILED:
        case NOT_SUPPORTED:
            // 失敗時の処理を適切に行います。
            break;
    }
}

ユーザーが同意した場合、UserDataオブジェクト(英語のみ)のUserProfileAccessConsentStatus(英語のみ)のステータスはCONSENTED(英語のみ)になります。ユーザーが同意していない場合、または同意トークンの有効期限が切れている場合、UserProfileAccessConsentStatus(英語のみ)のステータスはUNAVAILABLE(英語のみ)になります。

ユーザーが同意した場合、アプリはrequestUserProfileAccess()メソッド(英語のみ)を呼び出し、レスポンスオブジェクトに含まれている認可コードでサーバーを更新する必要があります。次に、Appstore IAPが提供するREST APIを使用して、アクセストークンとユーザープロフィールを取得します。共有されたユーザー情報を使用して、システムにアカウントを作成します。

次のコードは、UserProfileAccessResponseオブジェクト(英語のみ)からユーザープロフィールのアクセス認可コードを抽出する方法を示しています。

@Override
public void onUserProfileAccessResponse(final UserProfileAccessResponse response) {
    
    UserProfileAccessResponse.RequestStatus status = response.getRequestStatus();
    
    switch (status) {
        case SUCCESSFUL:
            // ここでuserProfileAccessAuthCodeを使用してサーバーを更新し、
            // Appstore IAP REST APIとさらに連携して、アクセストークンとユーザープロフィールを取得する必要があります。
            final String userProfileAccessAuthCode = response.getUserProfileAccessAuthCode();
            break;
    
        case FAILED:
        case NOT_SUPPORTED:
            // 失敗時の処理を適切に行います。
            break;
    } 
}

ユーザーが同意しない場合は、独自のサインイン画面を表示します。これにより、ユーザーはキーボードで認証情報を入力してアプリにサインインできます。

Get Access Token API

Appstore IAPには、アクセストークンを取得するためのGet Access Token REST APIが用意されています。このセクションでは、リクエスト、レスポンス、エラーについて説明します。

アクセストークンリクエスト

requestUserProfileAccess()(英語のみ)のレスポンスと有効な認可コードを受け取ったアプリは、そのコードを使用してアクセストークンを取得できます。アクセストークンがあれば、クライアントはユーザープロフィールを読み取ることができます。

Get Access Token APIは、次の例に示すように、GETリクエストではなくPOSTリクエストを使用する必要があります。

POST https://appstore-sdk.amazon.com/version/1.0/auth/o2/token?
grant_type=authorization_code
&code=SplxlOBezQQYbYS6WxSbIA
&client_id=foodev
&client_secret=foosecret

次の表では、アクセストークンリクエストのパラメーターについて説明します。

アクセストークンリクエストのパラメーター
リクエストパラメーター 説明
grant_type 必須。リクエストされたアクセスグラントのタイプ。authorization_codeを指定する必要があります。
code 必須。requestUserProfileAccess()メソッド(英語のみ)から返された認可コード。
client_id 必須。クライアント識別子。
client_secret 必須。登録時にクライアントに割り当てられたシークレット値。クライアントシークレットはウェブページに確実に保存できないため、ブラウザベースのアプリではクライアントシークレットを使用しないでください。

アクセストークンレスポンス

ユーザーデータにアクセスするには、Appstore IAPのGet User Profile APIにアクセストークンを提供する必要があります。アクセストークンは350文字以上の英数字のコードで、最大サイズは2,048バイトです。アクセストークンはAtza|という文字列で始まります。

レスポンスパラメーターは、application/jsonメディアタイプを使用してエンコードされます。詳細については、RFC4627(英語のみ)を参照してください。以下は、アクセストークンリクエストからのレスポンスの例です。

{
"access_token":"Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"Atzr|IQEBLzAtAhRPpMJxdwVz2Nn6f2y-tpJX2DeX..."
}

次の表では、アクセストークンレスポンスのパラメーターについて説明します。

アクセストークンレスポンスのパラメーター
レスポンスパラメーター 説明
access_token ユーザーアカウントのアクセストークン。最大サイズは2,048バイトです。
token_type 返されたトークンのタイプ。値はbearerです。
expires_in アクセストークンが無効になるまでの秒数。
refresh_token 新しいアクセストークンのリクエストに使用できるリフレッシュトークン。最大サイズは2,048バイトです。

アクセストークンはBearerトークンであり、別のクライアントでも使用できます。詳細については、The OAuth 2.0 Authorization Framework: Bearer Token Usage(英語のみ)を参照してください。

アクセストークンエラー

エラーによっては、認可サービスがHTTP 401 (Unauthorized)のステータスコードを返す場合があります。これには、クライアントが認可ヘッダーでclient_idclient_secretの値を渡したものの、クライアントが認証されなかった場合などが該当します。

次の表では、失敗したレスポンスのエラーパラメーターについて説明します。

アクセストークンのエラーレスポンスパラメーター
エラーパラメーター 説明
error エラーコード値を表すASCIIエラーコード。
error_description クライアント開発者が判読できる形でエラーに関する情報を記載したASCII文字列。
request_id アクセストークンリクエストに関連付けられたID。

errorの値として次のエラーコードが返される可能性があります。

アクセストークンのエラーレスポンスコード
エラーコード 説明
invalid_request リクエストに必須パラメーターがない、値が無効、または形式に誤りがあります。
invalid_client クライアントの認証に失敗しました。これは、認可サービスがHTTP 401 (Unauthorized)ステータスコードを返さない場合に使用されます。
invalid_grant 認可コードが無効、期限切れ、取り消し済みであるか、または別のclient_idに対して発行されています。
unauthorized_client 認可コードを使用する権限がクライアントにありません。原因として、code_verifierが無効である可能性があります。
unsupported_grant_type クライアントが指定したtoken_typeに誤りがあります。
ServerError サーバーでランタイムエラーが発生しました。

Get User Profile API

Appstore IAPには、ユーザープロフィールデータを取得するためのGet User Profile REST APIが用意されています。このセクションでは、リクエスト、レスポンス、エラーについて説明します。

ユーザープロフィールのリクエスト

承認されたユーザープロフィールデータにアクセスするには、Get User Profile APIを使用してアクセストークンをAmazonアプリストアに送信します。Get User Profile APIは、HTTPS GETリクエストで、Get Access Token APIから受け取ったアクセストークンを唯一のパラメーターとして使用します。

次の例は、ユーザープロフィールデータを取得するGETリクエストを示しています。

GET https://appstore-sdk.amazon.com/version/1.0/user/profile?
access_token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...
ユーザープロフィールリクエストのパラメーター
リクエストパラメーター 説明
access_token 必須。Get Access Token APIから受け取ったアクセストークン。

ユーザープロフィールのレスポンス

アクセストークンが有効な場合は、次の例のように、HTTPレスポンスとしてユーザーのプロフィールデータがJSONで返されます。

{
"user_id": "amznl.account.K2LI23KL2LK2",
"email":"mhashimoto-04@plaxo.com",
"name" :"Mork Hashimoto",
"postal_code": "98052"
}

プロフィールリクエストを処理できない場合は、HTTPエラーが返されます。このとき、次の例のように、詳細情報を含むJSONペイロードが返されることがあります。

{
"error": "コンピューターで解読できるエラーコード",
"error_description": "human-readable error description",
"request_id": "bef0c2f8-e292-4l96-8c95-8833fbd559df"
}

次の表に、ユーザープロフィールリクエストが失敗した場合に返される可能性のあるエラーコードを示します。

ユーザープロフィールのエラーレスポンスコード
HTTPステータスコード ステータスメッセージ 説明
200 Success リクエストは成功しました。
400 invalid_request リクエストに必須パラメーターが含まれていないか、形式に誤りがあります。
400 invalid_token 提供されたアクセストークンは、期限切れ、取り消し済み、誤った形式であるか、その他の理由により無効です。
401 insufficient_scope 提供されたアクセストークンには必要なスコープへのアクセス権がありません。
500 ServerError サーバーでランタイムエラーが発生しました。

アカウント設定に関するベストプラクティス

ユーザーのアカウントを設定するときは、以下のベストプラクティスに従ってください。

  • getUserData()レスポンス(英語のみ)のUserProfileAccessConsentStatus(英語のみ)の値がCONSENTED(英語のみ)の場合は、次の操作を行います。
    • Appstore IAPのGet User Profile APIからユーザー情報を取得します。この情報を使用して、一時パスワードでログインアカウントを作成します。パスワードのリセットや追加情報をユーザーに要求することなく、ユーザーをアプリにサインインさせます。
    • 後で、パスワードをリセットするようにEメールでユーザーに通知します。
  • UserProfileAccessConsentStatus(英語のみ)がUNAVAILABLE(英語のみ)の場合は、アプリのデフォルトの登録エクスペリエンスをユーザーに表示します。

Last updated: 2026年1月7日