需要对应用进行的更改
对您的应用进行这些更改,以便实现简单登录。
与Appstore SDK集成
简单登录功能是通过Appstore SDK提供的。要将您的应用与简单登录集成,须与Appstore SDK集成,并在代码中使用简单登录API。
请参阅集成Appstore SDK,了解将Appstore SDK添加到项目中所需的步骤。亚马逊的Appstore SDK还包括其他功能,如应用内购买 (IAP) 和数字版权管理 (DRM)。根据您是否已经使用应用内购买 (IAP) 或亚马逊管理的DRM,现有应用的集成步骤会有所不同。有关更多信息,请参阅从IAP v2.0转换至Appstore SDK。
集成简单登录API
SDK中的程序包com.amazon.device.simplesignin
包含要与简单登录集成的类和接口。在该程序包中有两个主要文件。
这个类是一个入口点,它公开方法并保存应用与简单登录集成的其他构造。这个类中的方法允许您的应用与简单登录服务器进行通信。
SimpleSignInService
包含以下方法。
registerResponseHandler(Context appContext, ISimpleSignInResponseHandler responseHandler)
: 在调用任何其他SimpleSignInService
API之前,您必须创建ISimpleSignInResponseHandler
的实例,并将此实例连同应用环境传递至此方法,以注册您的响应处理程序。如果在调用此方法之前调用任何其他API,则会引发IllegalStateException
。linkUserAccount(LinkUserAccountRequest linkUserAccountRequest)
: 此方法启动一个请求,将用户的账户与其亚马逊账户关联。当响应可用时,会在ISimpleSignInResponseHandler
中调用回调方法onLinkUserAccountResponse()
。getUserAndLinks(String identityProviderName)
: 调用此方法来发起一个请求,以检索当前登录用户在亚马逊上可用的关联数据。当响应可用时,会在ISimpleSignInResponseHandler
中调用回调方法onGetUserAndLinksResponse
。identityProviderName
参数是在引入SSI期间接收到的唯一SSI ID。showLoginSelection(Map <String, String> loginNames)
: 调用此方法以发起一个请求,显示可用的关联账户列表,并允许用户从中进行选择。loginNames
参数是linkId
到用户可识别标识符的映射。当用户进行选择时,会在ISimpleSignInResponseHandler
中调用回调方法onShowLoginSelectionResponse()
。recordMetricEvent(SSIEventRequest ssiEventRequest)
: 调用此方法来发起一个请求,以记录用于指标发布的SSI事件。当响应可用时,会在ISimpleSignInResponseHandler
中调用回调方法onRecordMetricsEventResponse()
。
ISimpleSignInServiceResponseHandler接口
此接口包含回调方法的定义,当您通过SimpleSignInService
发起请求时,这些方法会向应用发送异步响应。您必须创建此接口的实现,并通过调用registerResponseHandler()
方法向SimpleSignInService
注册您的实现。您的ISimpleSignInServiceResponseHandler
实例应该实现以下方法。
onLinkUserAccountResponse(LinkUserAccountResponse linkUserAccountResponse)
: 当您调用SimpleSignInService.linkUserAccount()
并且可从Amazon获得LinkUserAccountResponse
对象时,会调用此回调方法。onGetUserAndLinksResponse(GetUserAndLinksResponse getUserAndLinksResponse)
: 当您调用SimpleSignInService.getUserAndLinks()
并且可从Amazon获得GetUserAndLinksResponse
对象时,会调用此回调方法。onShowLoginSelectionResponse(ShowLoginSelectionResponse showLoginSelectionResponse)
: 当您调用SimpleSignInService.showLoginSelection()
并且可从Amazon获得ShowLoginSelectionResponse
对象时,会调用此回调方法。onRecordMetricsEventResponse(RecordMetricsEventResponse recordMetricsEventResponse)
: 当您调用SimpleSignInService.recordMetricEvent()
并且可从Amazon获得RecordMetricsEventResponse
对象时,会调用此回调方法。
步骤1: 处理异步响应消息
为ISimpleSignInServiceResponseHandler
提供一个实现,以处理来自简单登录服务的异步响应消息。
示例: 以下是处理来自简单登录的响应消息的方式。
public class ResponseHandlerImpl implements ISimpleSignInResponseHandler {
public void onLinkUserAccountResponse(LinkUserAccountResponse response) {
// 添加自定义逻辑以通知客户。这是可选的操作,并且您
// 可以选择客户体验。
}
public void onGetUserAndLinksResponse(GetUserAndLinksResponse response) {
/*
* (a)在新账户关联过程中,从响应中提取设备上有效的亚马逊用户账户的有向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: 注册具体实现
在应用初始化期间,使用主活动类中的SimpleSignInService
注册ISimpleSignInServiceResponseHandler
的具体实现的实例。
@Override
protected void onCreate(Bundle savedInstanceState) {
final ISimpleSignInResponseHandler responseHandler = new ResponseHandlerImpl();
SimpleSignInService.registerResponseHandler(getApplicationContext(), responseHandler);
}
步骤3: 修改您的登录流程以启用简单登录
当用户导航到应用中的登录流程时,通过查询getUserAndLinks()
来检查可用于启用简单登录的任何关联账户。
- 如果没有找到关联的账户,可以直接回退到您的标准登录流程。
- 否则,请调用
showLoginSelection()
显示SSI登录屏幕,并提示用户选择用于登录的账户。
当用户通过手动输入凭证来登录时,如果成功登录,
- 通过以下SSI事件发送
recordMetricEvent()
请求: MANUAL_SIGNIN_SELECTED - 发送
linkUserAccount()
请求以寻求用户对账户关联的同意,并启动关联过程。
当用户使用链接令牌登录而没有手动输入凭证时,
- 如果成功登录,通过以下SSI事件发送
recordMetricEvent()
请求: LOGIN_SUCCESS - 使用链接令牌登录失败时,通过以下SSI事件发送
recordMetricEvent()
请求: LOGIN_FAILURE,然后优雅地回退到标准登录流程。
当用户注册新账户时,在成功注册后,发送linkUserAccount()
请求以寻求用户对账户关联的同意,并启动关联过程。
有关客户端API的更多详细描述,请参阅SSI客户端API。
步骤4: 处理应用升级场景
对于在添加简单登录之前已登录您应用的客户,提供一个选项,让他们在升级到支持简单登录的应用最新版本时关联自己的账户。当他们在升级后首次启动应用时,为登录用户生成关联令牌,并调用linkUserAccount()
来设置账户关联。要实现此操作,请遵照以下指南。
实现指南
亚马逊应用商店建议在应用启动期间使用账户关联设置流程,但您可以根据自己的喜好选择实现方式。例如,您可以等到客户导航到应用上的账户设置页面,而不是在应用启动时显示账户关联对话框。如果客户之前已同意使用简单登录,请确保不会再次显示SSI同意屏幕。
您可以使用基于本地维护的两个持久状态属性的条件逻辑来实现这一点,例如让应用使用共享首选项。
- 属性#1: (数据类型: 布尔值)指示用户是否已登录应用。在大多数情况下,您可以根据他们在设备上缓存的数据(如身份验证令牌、用户设置)来推断登录状态,而无需引入新的状态变量来跟踪登录状态。
- 属性#2: (数据类型: 布尔值)指示当前登录的用户是否已获得将其应用用户账户与亚马逊账户关联的选项。
- 如果值为
TRUE
,则表示向用户显示SSI同意对话框,无论用户是否已同意。 - 如果值为null或
FALSE
,则表示用户尚未看到SSI同意对话框。
- 如果值为
例如,假设以上两个属性分别命名为loginStatus
和ssiConsentStatus
。相应逻辑如下所示。
if (loginStatus == Boolean.TRUE && ssiConsentStatus != Boolean.TRUE) {
/*
已登录的用户从未获得关联其
SSI账户的选项。当客户登录时,
设备/应用上的SSI功能不可用,
或者客户在登录时关闭了SSI功能。
*/
// 发起账户关联流程
/*
步骤:
1.调用getUserAndLinks API以获取其亚马逊账户的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用户同意对话框时,ssiConsentStatus
可能会根据来自linkUserAccount()
的响应进行更新。如果resultStatus
为SUCCESSFUL
,则必须将ssiConsentStatus
更新为TRUE
。 - 当客户使用之前关联的账户登录SSI时,无需再次要求他们同意SSI账户关联。因此,
ssiConsentStatus
必须设置为TRUE
。
用户注销:
- 当用户注销并拥有SSI关联账户时,询问用户
- 是否要注销应用并注销设备上的“简单登录”功能。
- 注销应用,但保留“简单登录”以供将来登录。
- 注销其账户使用了“简单登录”的应用的所有实例。
- 基线行为应该是第一个选项,即注销应用及其设备上的“简单登录”功能。
- 当客户注销应用时,必须重置
ssiConsentStatus
字段,重置方法为删除属性或将值设置为FALSE
。
测试简单登录集成
您可以在测试设备上安装App Tester APK,并在沙盒模式下运行应用,以在发布到亚马逊应用商店之前测试应用上的简单登录行为。有关更多详细信息,请参阅使用App Tester测试您的应用。
Last updated: 2024年11月21日