Android用のLogin with Amazon SDK APIを使用する

Android用のLogin with Amazon SDK APIを使用する

ログインボタンの処理とプロファイルデータの取得

このセクションでは、authorize APIを呼び出してユーザーをログインする方法について説明します。これには、[Login with Amazon] ボタン用にonClickリスナーをアプリのonCreateメソッドに作成することが含まれます。

  1. AndroidプロジェクトにLogin with Amazonを追加します。
  2. RequestContextを初期化します。

    RequestContext変数を宣言し、このクラスの新しいインスタンスを作成する必要があります。RequestContextを初期化するのに最適な場所は、AndroidアクティビティまたはフラグメントのonCreateメソッド内です。次に例を示します。

    private RequestContext requestContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestContext = RequestContext.create(this);
    }
    
  3. AuthorizeListenerを作成します。

    AuthorizeListenerauthorize呼び出しの結果を処理します。これには、onSuccessonErroronCancelの3つのメソッドが含まれます。AuthorizeListenerインターフェイスと一緒にregisterListener呼び出しをAndroidアクティビティまたはフラグメントのonCreateメソッドに作成します。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestContext = RequestContext.create(this);
    
        requestContext.registerListener(new AuthorizeListener() {
    
            /* 認可が正常に完了。 */
            @Override
            public void onSuccess(AuthorizeResult result) {
                /* リクエストしたスコープに対してアプリが認可された */
            }
    
            /* アプリの認可中にエラーが
            発生。 */
            @Override
            public void onError(AuthError ae) {
                /* ユーザーにエラーを通知 */
            }
    
            /* 完了前に認可がキャンセル。 */
            @Override
            public void onCancel(AuthCancellation cancellation) {
                /* UIをready-to-loginの状態にリセット */
            }
        });
    }
    
  4. onSuccessonErroronCancelAuthorizeListenerに実装します。

    認可プロセスでは、ウェブブラウザ(またはWebView)を使用中のユーザーにログイン画面(場合によっては同意画面も)が表示されます。これに伴い、ユーザーがログインをキャンセルしたり、別の画面に移動したりできる手段も用意しておきます。ユーザーがログインプロセスを明示的にキャンセルした場合は、onCancelを呼び出してユーザーインターフェイスをリセットする必要があります。

    ユーザーがブラウザやWebViewのログイン画面から離れてアプリに戻る選択をした場合、SDKではログインが未完了であることを検出しません。ログインの完了前にアプリでユーザーのアクティビティが検出された場合にはユーザーがブラウザから離れたと考えられるため、それに応じた対応を取ります。

  5. RequestContext.onResumeを呼び出します。

    Androidアプリのライフサイクルに対応するため、アクティビティやフラグメントにonResumeメソッドを実装します。このメソッドにより、ユーザーが認可フローを完了する前にオペレーティングシステムによってアプリが閉じられた場合には、registerListenerに登録されているあらゆるリスナーがトリガーされます。

    @Override
    protected void onResume() {
        super.onResume();
        requestContext.onResume();
    }
    
  6. AuthorizationManager.authorizeを呼び出します。

    [Login with Amazon] ボタンのonClickハンドラーで、authorizeを呼び出してユーザーにログインとアプリの認可を求める画面を表示します。

    この場合、ユーザーは次のいずれかの方法でサインインとリクエストされた情報への同意を行うことができます。

    1. システムブラウザに切り替える
    2. 安全なコンテキストでウェブ表示に切り替える(デバイスにAmazonショッピングアプリがインストールされている場合)

    2番目の選択肢にある安全なコンテキストは、Amazonショッピングアプリをデバイスにインストールしている場合に使用できます。Fire OSが実行されているAmazon製のデバイス(Kindle Fire、Fire Phone、Fire TVなど)では、デバイスにAmazonショッピングアプリがインストールされていなくても常にこの方法が適用されます。このため、ユーザーがAmazonショッピングアプリにサインインしている場合、APIによってサインインのページはスキップされ、ユーザーはシングルサインオンを実行できます。詳細については、Android/Fireアプリのユーザーエクスペリエンスに関するページを参照してください。

    アプリの認可時には、スコープと呼ばれるデータセット(1つ以上)に対して認可されます。スコープには、Login with Amazonに対してリクエストしているユーザーデータが含まれます。ユーザーが初めてアプリにログインするときに、開発者がリクエストして承認を求めているデータの一覧と一緒に提示されます。

    Login with Amazonは現在、次のスコープをサポートしています。profile(ユーザーの名前、Eメールアドレス、AmazonアカウントIDへのアクセスを許可)、profile:user_id(ユーザーのAmazonアカウントIDのみへのアクセスを許可)、postal_code(Amazonアカウントに登録されているユーザーの郵便番号へのアクセスを許可)の3つです。

    AuthorizationManager.authorizeは非同期呼び出しのため、UIスレッドをブロックしたり、独自のワーカースレッドを作成したりする必要がありません。authorizeを呼び出すには、AuthorizeRequest.Builderを使用して作成できるAuthorizeRequestオブジェクトを渡します。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            /* 以前のonCreate宣言の省略 */
    
            // login_with_amazon IDのボタンを検索し
            // クリックハンドラーをセットアップ
            View loginButton = findViewById(R.id.login_with_amazon);
            loginButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        AuthorizationManager.authorize(new AuthorizeRequest
                            .Builder(requestContext)
                            .addScopes(ProfileScope.profile(), ProfileScope.postalCode())
                            .build());
                    });
            }
          }
    

ユーザープロファイルデータの取得

このセクションでは、User APIを使用して、ユーザーの認可後にプロファイルデータを取得する方法について説明します。取得できるプロファイルデータは、authorize:withHandler:呼び出しで示されるスコープに基づきます。

  1. User.fetchを呼び出します。

    User.fetchは、ユーザーのプロファイルデータを、Listener<User, AuthError>コールバックを通じて返します。Listener<User, AuthError>にはonSuccessonErrorの2つのメソッドが含まれます(User.fetch呼び出しをキャンセルする手段がないため、onCancelはサポートされていません)。onSuccessはプロファイルデータが含まれるUserオブジェクトを受け取ります。onErrorはエラーの情報を含むAuthErrorオブジェクトを受け取ります。updateProfileDataは、ユーザーインターフェイスにプロファイルデータを表示する目的でアプリが実装できる関数の一例です。

    @Override
    protected void onStart() {
        super.onStart();
        Scope[] scopes = {
            ProfileScope.profile(),
            ProfileScope.postalCode()
        };
        AuthorizationManager.getToken(this, scopes, new Listener < AuthorizeResult, AuthError > () {
    
            @Override
            public void onSuccess(AuthorizeResult result) {
                if (result.getAccessToken() != null) {
                    /* ユーザーはサインインしている */
                } else {
                    /* ユーザーはサインインしていない */
                }
            }
    
            @Override
            public void onError(AuthError ae) {
                /* ユーザーはサインインしていない */
            }
        });
    }
    

起動時のユーザーログインの確認

アプリにログインしたユーザーが、アプリをいったん終了した後で再度アプリを起動させた場合、アプリは引き続きデータを取得できます。ユーザーが自動的にログアウトされることはありません。起動時にアプリが認可されていれば、ユーザーにログイン後の状態を表示できます。このセクションではgetTokenを使用して、アプリがまだ認可されているかどうかを確認する方法について説明します。

  1. getTokenを呼び出します。

    アクティビティまたはフラグメントのonStartメソッドで、getTokenを呼び出して、アプリがまだ認可されているかどうかを確認します。getTokenは未処理のアクセストークンを受け取り、AuthorizationManagerはそれを使用してユーザープロファイルにアクセスします。トークンの値がnullでなければ、アプリはまだ認可されている状態であり、ユーザープロファイルデータを取得するプロセスに進めます。getTokenには、authorize呼び出しでリクエストされた同じスコープが必要です。

    getTokenUser.fetchと同じ方法で非同期呼び出しをサポートします。したがって、UIスレッドをブロックしたり、独自のワーカースレッドを作成したりする必要がありません。getTokenを非同期的に呼び出すには、Listener<AuthorizeRequest, AuthError>インターフェイスをサポートするオブジェクトを最後のパラメーターとして渡します。

  2. Listener<AuthorizeResult, AuthError>を宣言します。

    Listener<AuthorizeResult, AuthError>インターフェイスの実装はgetToken呼び出しの結果を処理します。リスナーに含まれるメソッドは、onSuccessonErrorの2つです(getToken呼び出しをキャンセルする方法はないため、onCancelはサポートされません)。

  3. onSuccessonErrorListener<AuthorizeResult, AuthError>に実装します。

    onSuccessは、アクセストークンを含むAuthorizeResultオブジェクトを受け取ります。onErrorは、エラーの情報を含むAuthErrorオブジェクトを受け取ります。

    @Override
    protected void onStart() {
        super.onStart();
        Scope[] scopes = {
            ProfileScope.profile(),
            ProfileScope.postalCode()
        };
        AuthorizationManager.getToken(this, scopes, new Listener < AuthorizeResult, AuthError > () {
    
            @Override
            public void onSuccess(AuthorizeResult result) {
                if (result.getAccessToken() != null) {
                    /* ユーザーはサインインしている */
                } else {
                    /* ユーザーはサインインしていない */
                }
            }
    
            @Override
            public void onError(AuthError ae) {
                /* ユーザーはサインインしていない */
            }
        });
    }
    

認可データの消去とユーザーのログアウト

このセクションでは、signOutメソッドを使用して、ユーザーの認可データをAuthorizationManagerローカルデータストアから消去する方法について説明します。アプリがプロファイルデータを取得するには、ユーザーが再度ログインする必要があります。このメソッドを使用するのは、ユーザーをログアウトする場合、またはアプリのログイン問題をトラブルシューティングする場合です。

  1. ログアウトのメカニズムを実装します。

    ユーザーがログインに成功したら、ログアウトのメカニズムを提供してユーザーがプロファイルデータと過去の認可済みのスコープを消去できるようにします。ログアウトのメカニズムとして、ハイパーリンク、ボタン、メニューアイテムを使用できます。この例では、ボタンのonClickメソッドを作成します。

  2. signOut:を呼び出します。

    signOutをログアウトハンドラーで呼び出し、ユーザーの認可データ(アクセストークン、プロファイル)をローカルストアから削除します。signOutでは、AndroidコンテキストListener<Void, AuthError>を使用して、成功または失敗を処理します。

  3. 匿名のListener<Void, AuthError>を宣言します。

    Listener<Void, AuthError>の実装がsignOut呼び出しの結果を処理します。匿名クラスは、エンクロージングスコープから変数を取得する場合に役立ちます。リスナークラスを宣言する例については、「ログインボタンの処理とユーザーの認可」を参照してください。

  4. onSuccessonErrorListener<Void, AuthError>に実装します。

    signOutに成功すると、UIをアップデートしてユーザーのリファレンスを削除し、ユーザーが再度ログインできるようにログインメカニズムを提供する必要があります。signOutがエラーを返した場合は、ユーザーがログアウトを再試行できるようにします。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /* 以前のonCreate宣言の省略 */
    
    // ログアウトIDのボタンを検索してクリックハンドラーをセットアップ View logoutButton = findViewById(R.id.logout); logoutButton.setOnClickListener(new View.OnClickListener() {
    
    @Override
    public void onClick(View v) {
        AuthorizationManager.signOut(getApplicationContext(), new Listener < Void, AuthError > () {
            @Override
            public void onSuccess(Void response) {
                // UIにログアウト状態を設定
            }
            @Override
            public void onError(AuthError authError) {
                // エラーをログに記録
            }
        });
    }
    });
    }