Android 3.x用のLogin with Amazon SDKへの移行ガイド


Android 3.x用のLogin with Amazon SDKへの移行ガイド

このガイドでは、アプリで使用しているAndroid用のLogin with Amazon SDKをv2.0.2(またはそれ以下)からAndroid v3.xに移行する方法について説明します。

アプリとLogin with Amazonをまだ統合していない場合は、Androidのスタートガイドの一連の手順を参照してください。

アプリで使用しているAndroid用のLogin with Amazon SDKバージョンを確認する方法

アプリで使用しているAndroid用のLogin with Amazon SDKのバージョンを確認するには、次の手順を実行します。

  1. Mac/Unixターミナルを開きます。
  2. AndroidアプリでAndroid用のLogin with Amazon SDK(login-with-amazon-sdk.jar)を格納しているフォルダに移動します。一般的に、これはプロジェクトのルートディレクトリです。
  3. 次のコマンドを実行し、SDKのバージョン番号を出力します。
    `javap -classpath ./login-with-amazon-sdk.jar -constants com.amazon.identity.auth.map.device.utils.MAPVersionInfo | grep -o "LWA_VERSION = .*"`
    

アップグレードの方法

  1. Android用のLogin with Amazon SDKの最新バージョンをダウンロードします。
  2. ハードドライブのディレクトリにファイルを展開し、LoginWithAmazonフォルダに移動します。
  3. このフォルダにあるlogin-with-amazon-sdk.jarを使用して、Androidアプリにある古いSDKの.jarファイルと置き換えます。それには、新しい.jarファイルをクリップボードにコピーして、古い.jarファイルが保存されているAndroidプロジェクトのフォルダ(通常はプロジェクトのルートディレクトリ)に貼り付けます。
  4. 次の手順に従って、Login with Amazon 3.0ライブラリに導入された新しいAPIに移行します。

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

RequestContextとregisterListenerを初期化する

新しいAndroid用のLWA SDKでは、AuthorizationManagerインスタンスを初期化する必要がありません。その代わり、RequestContext変数を宣言してそのクラスの新しいインスタンスを作成する必要があります。RequestContextを初期化するのに最適な場所は、AndroidアクティビティまたはフラグメントのonCreateメソッド内です。RequestContextインスタンスが作成されたら、AuthorizeListenerインターフェイスと一緒にregisterListener呼び出しを作成します。

AuthorizeListener()のonSuccess()メソッドでユーザープロファイルデータを取得する

新しいAuthorizeListenerクラスのonSuccess()メソッドで入力引数タイプがAuthorizeResultに変更されました。AuthorizeResultオブジェクトには、AuthorizationManager.authorize呼び出しが成功したときのLWA認可サーバーからのレスポンスが含まれます。

  1. userprofileスコープをリクエストした場合、AuthorizeResultオブジェクトには、リクエストされたユーザープロファイルデータを含むUserオブジェクトが含まれます。AuthorizationManager.getProfileAuthorizeListeneronSuccessメソッドから呼び出す必要はありません(Android用の以前のバージョンのLWA SDKでは必要でした)。プロファイルデータの取得に関する詳細については、SDKドキュメントに記載のUserクラスに関するクラスリファレンスを参照してください。
  2. accessTokenアクセストークンをリクエストした場合(デフォルトの処理)、LWA認可サーバーはレスポンスでアクセストークンを返します。AuthorizationManager.getTokenAuthorizeListeneronSuccessメソッドから呼び出す必要はありません(Android用の以前のバージョンのLWA SDKでは必要でした)。

    @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の状態にリセット */
    }
    });
    }
    
    @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());
    });
    }
    }
    

RequestContext.onResumeを呼び出す

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

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

AuthorizeRequestオブジェクトによりAuthorizationManager.authorizeメソッドを呼び出す

Android用の新しいLWA SDKでは、AuthorizationManager.authorizeメソッドへの変更が導入されています。AuthorizationManager.authorizeへの入力はAuthorizeRequestオブジェクトになります。AuthorizeRequestクラスで定義されたBuilderクラスを使用してリクエストオブジェクトを作成することをお勧めします。一般的にAuthorizeRequestオブジェクトに渡されるプロパティは次のとおりです。

  1. scopes: 認可リクエストの対象となるスコープを定義します。Profileクラスは、Login with Amazonで提供されるスコープを定義します。そのほかのAmazon製品のAPIを使用している場合、サポート対象のスコープについては各製品のドキュメントでご確認ください。
  2. requestContext: 以前に作成したrequestContextオブジェクト。

AuthorizeRequestオブジェクトのプロパティ一覧については、SDKドキュメント内のクラスリファレンスを参照してください。

AuthorizeRequestにスコープを追加する

Android用の新しいLWA SDKでは、スコープを表すためにScopeオブジェクトを使用します。スコープをリクエストするには、ScopeオブジェクトをAuthorizeRequestに追加する必要があります。これには2つの方法があります。

  1. Login with Amazonから提供されるユーザープロファイルscopeをリクエストするには、ProfileScopeクラスで定義されたメソッドを使用します。

    スコープ名 ProfileScopeクラスのメソッド
    profile ProfileScope.profile()
    postal_code ProfileScope.postalCode()
    profile:user_id ProfileScope.userId()
  2. もう1つの方法としては、次のようにScopeオブジェクトをScopeFactoryを使用して作成できます。

    ScopeFactory.scopeNamed("profile");
    

このメソッドを使用して、そのほかのAmazon製品に提供されるスコープをリクエストできます。

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

ユーザーがアプリにログインして認可を受けている限り、開発者はいつでもそのユーザーのプロファイルデータを取得できます。Android用の新しいLWA SDKでは、ユーザープロファイルデータを管理しやすいUserクラスが導入されています。よく使用されるユーザープロファイルデータの一部は、このクラスのプロパティとして定義されています。

  1. userID:ユーザーの一意の識別子。
  2. name:ユーザーの名前。
  3. email:ユーザーのEメールアドレス。
  4. postalCode:ユーザーの郵便番号。
  5. userInfo: ユーザーから提示されているプロファイルデータをすべて含むマップ。

以前のSDKバージョンではAuthorizationManager.getProfile呼び出しが必須でしたが、Android用の新しいLWA SDKでは、次の2つの方法でユーザープロファイルデータをリクエストできます。

  1. ユーザーがアプリにサインインしていないときは、AuthorizationManager.getProfileを呼び出してonSuccess()メソッドのresultオブジェクトにあるUserオブジェクトを取得します。
  2. ユーザーがアプリにサインインしている場合は、User.fetchを呼び出して、最新のユーザープロファイルデータを取得します。

    private void fetchUserProfile() {
    User.fetch(this, new Listener<User, AuthError>() {
    
    /* 取得が正常に終了。 */
    @Override
    public void onSuccess(User user) {
    final String name = user.getUserName();
    final String email = user.getUserEmail();
    final String account = user.getUserId();
    final String zipcode = user.getUserPostalCode();
    
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
    updateProfileData(name, email, account, zipcode);
    }
    });
    }
    
    /* プロファイルの取得中にエラーが発生。 */
    @Override
    public void onError(AuthError ae) {
    /* 再試行するか、ユーザーにエラーを通知 */
    }
    });
    }
    

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

Android用の新しいLWA SDKで提供される新たなsignOut APIを使用します。これは、clearAuthorizationStateを置き換えるものです。

@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) {
// エラーをログに記録
}
});
}
});
}