Android用のLogin with Amazon SDK APIを使用する
ログインボタンの処理とプロファイルデータの取得
このセクションでは、authorize
APIを呼び出してユーザーをログインする方法について説明します。これには、[Login with Amazon] ボタン用にonClick
リスナーをアプリのonCreate
メソッドに作成することが含まれます。
- AndroidプロジェクトにLogin with Amazonを追加します。
-
RequestContext
を初期化します。RequestContext
変数を宣言し、このクラスの新しいインスタンスを作成する必要があります。RequestContext
を初期化するのに最適な場所は、AndroidアクティビティまたはフラグメントのonCreate
メソッド内です。次に例を示します。private RequestContext requestContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestContext = RequestContext.create(this); }
-
AuthorizeListener
を作成します。AuthorizeListener
はauthorize
呼び出しの結果を処理します。これには、onSuccess
、onError
、onCancel
の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の状態にリセット */ } }); }
ヒント: フラグメントを使用して、View
オブジェクトの参照をAuthorizeListener
の実装で取得している場合、AuthorizeListener
をonCreate
にではなくonCreateViewメソッドに作成します。これにより、View
オブジェクト参照は、authorize
呼び出しが完了したときに設定されます。 -
onSuccess
、onError
、onCancel
をAuthorizeListener
に実装します。認可プロセスでは、ウェブブラウザ(またはWebView)を使用中のユーザーにログイン画面(場合によっては同意画面も)が表示されます。これに伴い、ユーザーがログインをキャンセルしたり、別の画面に移動したりできる手段も用意しておきます。ユーザーがログインプロセスを明示的にキャンセルした場合は、
onCancel
を呼び出してユーザーインターフェイスをリセットする必要があります。ユーザーがブラウザやWebViewのログイン画面から離れてアプリに戻る選択をした場合、SDKではログインが未完了であることを検出しません。ログインの完了前にアプリでユーザーのアクティビティが検出された場合にはユーザーがブラウザから離れたと考えられるため、それに応じた対応を取ります。
-
RequestContext.onResume
を呼び出します。Androidアプリのライフサイクルに対応するため、アクティビティやフラグメントに
onResume
メソッドを実装します。このメソッドにより、ユーザーが認可フローを完了する前にオペレーティングシステムによってアプリが閉じられた場合には、registerListener
に登録されているあらゆるリスナーがトリガーされます。@Override protected void onResume() { super.onResume(); requestContext.onResume(); }
-
AuthorizationManager.authorize
を呼び出します。[Login with Amazon] ボタンの
onClick
ハンドラーで、authorize
を呼び出してユーザーにログインとアプリの認可を求める画面を表示します。この場合、ユーザーは次のいずれかの方法でサインインとリクエストされた情報への同意を行うことができます。
- システムブラウザに切り替える
- 安全なコンテキストでウェブ表示に切り替える(デバイスに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:
呼び出しで示されるスコープに基づきます。
-
User.fetch
を呼び出します。User.fetch
は、ユーザーのプロファイルデータを、Listener<User, AuthError>
コールバックを通じて返します。Listener<User, AuthError>
にはonSuccess
とonError
の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) { /* ユーザーはサインインしていない */ } }); }
注:User.getUserPostalCode
が返されるのは、ProfileScope.postalCode()
スコープをリクエストした場合のみです。
起動時のユーザーログインの確認
アプリにログインしたユーザーが、アプリをいったん終了した後で再度アプリを起動させた場合、アプリは引き続きデータを取得できます。ユーザーが自動的にログアウトされることはありません。起動時にアプリが認可されていれば、ユーザーにログイン後の状態を表示できます。このセクションではgetToken
を使用して、アプリがまだ認可されているかどうかを確認する方法について説明します。
-
getToken
を呼び出します。アクティビティまたはフラグメントの
onStart
メソッドで、getToken
を呼び出して、アプリがまだ認可されているかどうかを確認します。getToken
は未処理のアクセストークンを受け取り、AuthorizationManager
はそれを使用してユーザープロファイルにアクセスします。トークンの値がnullでなければ、アプリはまだ認可されている状態であり、ユーザープロファイルデータを取得するプロセスに進めます。getToken
には、authorize
呼び出しでリクエストされた同じスコープが必要です。getToken
はUser.fetch
と同じ方法で非同期呼び出しをサポートします。したがって、UIスレッドをブロックしたり、独自のワーカースレッドを作成したりする必要がありません。getToken
を非同期的に呼び出すには、Listener<AuthorizeRequest, AuthError>
インターフェイスをサポートするオブジェクトを最後のパラメーターとして渡します。 -
Listener<AuthorizeResult, AuthError>
を宣言します。Listener<AuthorizeResult, AuthError>
インターフェイスの実装はgetToken
呼び出しの結果を処理します。リスナーに含まれるメソッドは、onSuccess
とonError
の2つです(getToken
呼び出しをキャンセルする方法はないため、onCancel
はサポートされません)。 -
onSuccess
とonError
をListener<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
ローカルデータストアから消去する方法について説明します。アプリがプロファイルデータを取得するには、ユーザーが再度ログインする必要があります。このメソッドを使用するのは、ユーザーをログアウトする場合、またはアプリのログイン問題をトラブルシューティングする場合です。
-
ログアウトのメカニズムを実装します。
ユーザーがログインに成功したら、ログアウトのメカニズムを提供してユーザーがプロファイルデータと過去の認可済みのスコープを消去できるようにします。ログアウトのメカニズムとして、ハイパーリンク、ボタン、メニューアイテムを使用できます。この例では、ボタンの
onClick
メソッドを作成します。 -
signOut:
を呼び出します。signOut
をログアウトハンドラーで呼び出し、ユーザーの認可データ(アクセストークン、プロファイル)をローカルストアから削除します。signOut
では、AndroidコンテキストとListener<Void, AuthError>
を使用して、成功または失敗を処理します。 -
匿名の
Listener<Void, AuthError>
を宣言します。Listener<Void, AuthError>
の実装がsignOut
呼び出しの結果を処理します。匿名クラスは、エンクロージングスコープから変数を取得する場合に役立ちます。リスナークラスを宣言する例については、「ログインボタンの処理とユーザーの認可」を参照してください。 -
onSuccess
とonError
をListener<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) { // エラーをログに記録 } }); } }); }