アプリで必要な変更
シンプルサインインを実装するには、アプリに次の変更を加えます。
Appstore SDKとの統合
シンプルサインイン機能は、Appstore SDKで提供されます。アプリにシンプルサインインを統合するには、Appstore SDKを統合し、コードでシンプルサインインAPIを使用します。
Appstore SDKをプロジェクトに追加するために必要な手順については、Appstore SDKの統合を参照してください。AmazonのAppstore SDKには、アプリ内課金(IAP)やデジタル著作権管理(DRM)などの機能も含まれています。既存のアプリの統合手順は、アプリ内課金(IAP)とAmazon管理のDRMのどちらを使用しているかによって異なります。詳細については、Appstore SDKへの移行を参照してください。
シンプルサインインAPIの統合
SDK内のcom.amazon.device.simplesignin
パッケージには、シンプルサインインと統合するためのクラスとインターフェイスが含まれています。このパッケージには主に2つのファイルがあります。
このクラスは、メソッドを公開し、アプリをシンプルサインインと統合するためのその他の構成を保持するエントリポイントです。このクラスのメソッドを使用すると、アプリはシンプルサインインサーバーと通信できます。
SimpleSignInService
には次のメソッドが含まれています。
registerResponseHandler(Context appContext, ISimpleSignInResponseHandler responseHandler)
: ほかのSimpleSignInService
APIを呼び出す前に、ISimpleSignInResponseHandler
のインスタンスを作成し、そのインスタンスをアプリコンテキストと共にこのメソッドに渡して、レスポンスハンドラーを登録する必要があります。このメソッドを呼び出す前にほかのAPIを呼び出すと、IllegalStateException
がスローされます。linkUserAccount(LinkUserAccountRequest linkUserAccountRequest)
: このメソッドは、ユーザーのアカウントをAmazonアカウントにリンクするためのリクエストを開始します。レスポンスが返されると、コールバックメソッドonLinkUserAccountResponse()
がISimpleSignInResponseHandler
で呼び出されます。getUserAndLinks(String identityProviderName)
: 現在ログインしているユーザーのリンクデータを取得するリクエストを開始するには、このメソッドを呼び出します。レスポンスが返されると、コールバックメソッドonGetUserAndLinksResponse
がISimpleSignInResponseHandler
で呼び出されます。identityProviderName
パラメーターは、SSIのオンボーディング中に受け取る一意のSSI IDです。showLoginSelection(Map <String, String> loginNames)
: 使用可能なリンク済みアカウントのリストを表示してユーザーがそこから選択できるようにするリクエストを開始するには、このメソッドを呼び出します。loginNames
パラメーターは、ユーザーが認識できる識別子にlinkId
をマッピングします。ユーザーが選択すると、コールバックメソッドonShowLoginSelectionResponse()
がISimpleSignInResponseHandler
で呼び出されます。recordMetricEvent(SSIEventRequest ssiEventRequest)
: 指標公開用のSSIイベントを記録するリクエストを開始するには、このメソッドを呼び出します。レスポンスが返されると、コールバックメソッドonRecordMetricsEventResponse()
がISimpleSignInResponseHandler
で呼び出されます。
ISimpleSignInServiceResponseHandlerインターフェイス
このインターフェイスには、SimpleSignInService
を介してリクエストを開始したときに非同期レスポンスをアプリに送信するコールバックメソッドの定義が含まれています。このインターフェイスの実装を作成し、registerResponseHandler()
メソッドを呼び出してSimpleSignInService
に実装を登録する必要があります。ISimpleSignInServiceResponseHandler
のインスタンスには、次のメソッドを実装する必要があります。
onLinkUserAccountResponse(LinkUserAccountResponse linkUserAccountResponse)
: このコールバックメソッドは、SimpleSignInService.linkUserAccount()
を呼び出してLinkUserAccountResponse
オブジェクトをAmazonから入手できるときに呼び出されます。onGetUserAndLinksResponse(GetUserAndLinksResponse getUserAndLinksResponse)
: このコールバックメソッドは、SimpleSignInService.getUserAndLinks()
を呼び出してGetUserAndLinksResponse
オブジェクトをAmazonから入手できるときに呼び出されます。onShowLoginSelectionResponse(ShowLoginSelectionResponse showLoginSelectionResponse)
: このコールバックメソッドは、SimpleSignInService.showLoginSelection()
を呼び出してShowLoginSelectionResponse
オブジェクトをAmazonから入手できるときに呼び出されます。onRecordMetricsEventResponse(RecordMetricsEventResponse recordMetricsEventResponse)
: このコールバックメソッドは、SimpleSignInService.recordMetricEvent()
を呼び出してRecordMetricsEventResponse
オブジェクトをAmazonから入手できるときに呼び出されます。
手順1: 非同期レスポンスメッセージを処理する
シンプルサインインサービスからの非同期レスポンスメッセージを処理するために、ISimpleSignInServiceResponseHandler
の実装を提供します。
例: シンプルサインインからのレスポンスメッセージを処理する方法は以下のとおりです。
public class ResponseHandlerImpl implements ISimpleSignInResponseHandler {
public void onLinkUserAccountResponse(LinkUserAccountResponse response) {
// ユーザーに通知するカスタムロジックを追加します。これは省略可能であり、
// ユーザーエクスペリエンスを選択できます。
}
public void onGetUserAndLinksResponse(GetUserAndLinksResponse response) {
/*
*(a)新規アカウントのリンク設定中に、デバイスでアクティブなAmazonユーザーアカウントで
* 管理されているIDをレスポンスから抽出し、それを使用してlinkTokenを生成します。
*(b)新規サインインの試行中に、リンク済みユーザーアカウントのSSIトークンを
* レスポンスから抽出し、それを使用して開発者側でユーザーの認証を行います。必要に応じて、
* ShowLoginSelection APIを呼び出し、ログイン選択画面からユーザーの確認を
* 促します。
*/
}
public void onShowLoginSelectionResponse(ShowLoginSelectionResponse response) {
/*
* ユーザーがログイン選択画面で行った選択に応じて、
* 選択したリンク済みアカウントに対応するSSIトークンを使用したログイン、
* または標準のサインインをユーザーに求めます。
*/
}
public void onLinkUserAccountResponse(LinkUserAccountResponse response) {
// ユーザーに通知するカスタムロジックを追加します。これは省略可能であり、
// ユーザーエクスペリエンスを選択できます。
}
public void onRecordMetricsEventResponse(RecordMetricsEventResponse recordMetricsEventResponse) {
// ここにログを追加すると、指標が正常に公開されたかどうかを追跡できます。
// これは省略可能です。
}
}
SSIクライアントからレスポンスメッセージをAndroidインテントとして受信するには、アプリのマニフェストファイルで次のブロードキャストレシーバーを宣言します。
<receiver android:name="com.amazon.device.simplesignin.BroadcastHandler" >
<intent-filter>
<action android:name="com.amazon.simplesignin.NOTIFY" android:permission="com.amazon.simplesignin.Permission.NOTIFY" />
</intent-filter>
</receiver>
手順2: 具体的な実装を登録する
アプリの初期化中に、ISimpleSignInServiceResponseHandler
の具体的な実装のインスタンスをメインアクティビティクラスからSimpleSignInService
に登録します。
@Override
protected void onCreate(Bundle savedInstanceState) {
final ISimpleSignInResponseHandler responseHandler = new ResponseHandlerImpl();
SimpleSignInService.registerResponseHandler(getApplicationContext(), responseHandler);
}
手順3: サインインフローを変更してシンプルサインインを有効にする
- ユーザーがアプリ内でサインインフローに移ったら、
getUserAndLinks()
を問い合わせて、シンプルサインインを有効にするために使用可能なリンク済みアカウントがないか確認します。- リンク済みアカウントが見つからない場合は、標準のサインインフローにフォールバックします。
- リンク済みアカウントが見つかった場合は、
showLoginSelection()
を呼び出してSSIログイン画面を表示し、サインインに使用するアカウントの選択をユーザーに求めます。
- ユーザーが認証情報を手動で入力してサインインし、サインインが成功したら、
linkUserAccount()
リクエストを送信して、アカウントのリンクに関する同意をユーザーに求め、リンクプロセスを開始します。 - ユーザーが新しいアカウントのサインアップに成功したら、
linkUserAccount()
リクエストを送信して、アカウントのリンクに関する同意をユーザーに求め、リンクプロセスを開始します。
クライアントAPIの詳細については、SSIクライアントAPIを参照してください。
手順4: アプリのアップグレードシナリオを処理する
シンプルサインインが追加される前にアプリにサインインしたユーザーに対しては、シンプルサインインをサポートする最新バージョンのアプリにアップグレードする際に、アカウントをリンクするためのオプションを提供します。アップグレード後に初めてアプリを起動するときに、ログイン済みユーザーのリンクトークンを生成し、linkUserAccount()
を呼び出してアカウントのリンクを設定します。これを実装するには、以下のガイダンスを参照してください。
実装に関するガイダンス
Amazonアプリストアでは、アプリ起動時のアカウントリンクフローを推奨していますが、好みに応じて実装することもできます。たとえば、アカウントリンクダイアログをアプリ起動時に表示するのではなく、ユーザーがアプリのアカウント設定ページに移動してから表示しても構いません。ユーザーがシンプルサインインの使用に同意済みの場合は、SSI同意画面が再び表示されないようにしてください。
これは、アプリで共有設定を使用するなど、ローカルに保持している2つの永続的なステートプロパティに基づく条件付きロジックを使用して実装できます。
- プロパティ#1: (データ型: Boolean型)ユーザーがアプリにサインイン済みかどうかを示します。ほとんどの場合、デバイスにキャッシュされたデータ(認証トークン、ユーザー設定など)に基づいてログインステータスを推測できます。新しいステート変数を導入して追跡する必要はありません。
- プロパティ#2: (データ型: Boolean型)現在サインインしているユーザーに、アプリユーザーアカウントをAmazonアカウントにリンクするオプションが既に付与されているかどうかを示します。
- 値が
TRUE
の場合、ユーザーが同意したかどうかにかかわらず、SSI同意ダイアログが表示されたことを意味します。 - 値がnullまたは
FALSE
の場合は、SSI同意ダイアログがまだ表示されていないことを示します。
- 値が
たとえば、上記の2つのプロパティの名前がそれぞれloginStatus
とssiConsentStatus
である場合、ロジックは次のとおりです。
if (loginStatus == Boolean.TRUE && ssiConsentStatus != Boolean.TRUE) {
/*
ログイン済みのユーザーに、アカウントをSSIにリンクするオプションが
付与されていません。ログイン時にデバイス/アプリで
SSI機能が利用できなかったか、ログイン時にユーザーが
SSI機能をオフにしたかのどちらかです。
*/
// アカウントリンクフローを開始します
/*
手順:
1.getUserAndLinks APIを呼び出して、AmazonアカウントのdirectedAmazonUserIdを取得します。
2.getUserAndLinksのresultStatusがSUCCESSFULである場合にのみ、次の手順に進みます。
3.バックエンドサーバーを呼び出してlinkTokenを生成します。
4.linkUserAccount APIを呼び出して、アカウントのリンクを設定します。
5.linkUserAccount APIレスポンスで返されたresultStatusに基づいて
ssiConsentStatusプロパティを更新します。
5a.resultStatusがSUCCESSFULの場合は、ssiConsentStatusをTRUEに設定します。
*/
}
ユーザーがアプリをインストールすると、ssiConsentStatus
フィールドが最初に設定解除されます(デフォルトはFALSE
)。ユーザーがサインインまたはサインアウトしたら、ssiConsentStatus
フィールドを次のように更新する必要があります。
ユーザーがサインインした場合:
linkUserAccount()
を呼び出すことで、アプリに手動でサインインしたユーザーがSSIユーザー同意ダイアログを受け取った場合、linkUserAccount()
からのレスポンスに応じてssiConsentStatus
が更新されることがあります。resultStatus
がSUCCESSFUL
の場合、ssiConsentStatus
をTRUE
に更新する必要があります。- 以前にリンクされたアカウントを使用してSSIにログインしたユーザーに対して、SSIアカウントのリンクに関する同意を再度求める必要はありません。したがって、
ssiConsentStatus
をTRUE
に設定する必要があります。
ユーザーがサインアウトした場合:
- ユーザーがログアウトし、SSIにリンクされたアカウントを持っているときに、ユーザーに以下を希望するかどうかをたずねます。
- アプリからサインアウトし、デバイスのシンプルサインイン機能からサインアウトする。
- アプリからサインアウトするが、シンプルサインインは今後のサインインに備えてそのまま残す。
- アカウントにシンプルサインインが使用されているアプリのすべてのインスタンスからサインアウトする。
- 基本的な行動は1つ目の選択肢(アプリからサインアウトし、デバイスのシンプルサインイン機能からサインアウトする)です。
- ユーザーがアプリからサインアウトしたら、
ssiConsentStatus
フィールドをリセットする必要があります。リセットするには、プロパティを削除するか、値をFALSE
に設定します。
シンプルサインインの統合のテスト
Amazonアプリストアに公開する前に、アプリでシンプルサインインの動作をテストするには、App Tester APKをテストデバイスにインストールし、アプリをサンドボックスモードで実行します。詳細については、App Testerを使用してアプリをテストする方法を参照してください。
次のステップ: バックエンドで必要な変更