本站已关停,现有内容仅作科研等非赢利用途使用。特此声明。
查看: 2938|回复: 2
打印 上一主题 下一主题

Smart Lock:无需密码,一键注册、自动登录

[复制链接]
跳转到指定楼层
1#
发表于 2016-2-3 14:59:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hanguokai 于 2016-2-3 15:00 编辑

英文原文:One tap sign-up and automatic sign-in without password entry using Smart Lock

作者:Steven Soneff,Google Identity 产品经理。


依托 Google 的 Smart Lock for Passwords,在 Android 设备上登录 Netflix 应用的用户逾 30% 不再需要输入密码。了解详情


发布 Smart Lock for Passwords 以来已有六个月了,在它的影响下,用户又重新登录了他们喜欢的很多应用,对此我们感到非常高兴。已经有数百万用户使用已保存的帐户从一台 Android 设备到另一台设备或从 Chrome 到 Android 无缝登录 40 多个应用,反之亦然。第一波开发者已经实现了通过消除登录困惑来提高用户回访度、增加获利机会以及促进跨设备分析,进而提升了应用的价值及其用户体验。


在 Smart Lock 的帮助下,New York Times 的新登录活动增加了 80%。同时,Netflix 客户支持团队发现有关其 Android 用户群帐户恢复的支持案例减少了 20% 以上。用户广泛选择在其各个设备上均保持登录状态,其中逾 60% 的用户选择为支持 Smart Lock 的主要应用保存登录信息。这些应用的开发者中很多都可以使用不到一天的工作来实现这些增长,方法是只需对其应用进行一些客户端修改即可。如需了解有关 Smart Lock for Passwords 的更多信息,请访问我们的开发者网站


新版特性

在最新版本的 Google Play Services 中,我们对 Smart Lock for Passwords API 做了一些改进,以帮助您更快速地完成新用户注册或现有用户登录。通过使用新方法检索登录“提示”,您的用户将会看到一个对话框,其中列有电子邮件地址列表,用户可从中一键选择:


这项全新体验对于 Android Marshmallow 的运行时权限模型尤为重要。为简化并提升用户体验,此对话框不需要设备权限,而且对话框中包括用户使用 Smart Lock 保存的所有电子邮件地址,而不仅仅是该设备上的帐户。这意味着,您可以改进您的登录和注册流程,让大多数用户再也不需要键入其电子邮件地址。结果显示,使用此对话框的应用有近四分之三的用户是选择对话框中所示的条目,从而提高了注册率。


接下来,一款成熟的应用可利用一些服务器端支持,在用户点击并分享其电子邮件地址后,为用户完全定制登录流程。通过使用电子邮件地址,您可以检查您的数据库,查看用户是否已注册帐户。然后,您可以智能方式呈现登录或注册屏幕,并预填充该用户的电子邮件地址、姓名和个人资料照片。


完全跳过密码

可以做得更好:如果用户从对话框中选择一个 Google 帐户,则提供 OpenID Connect ID 令牌。这样可以使应用无需为新帐户验证电子邮件地址,或者让应用能够为返回的用户完全跳过密码。ID 令牌还可供 Google Sign-In 用于替代密码来进行身份验证,而且它是 Google 对给定电子邮件地址所有者存在的明确肯定。如果您站点的用户通过电子邮件找回密码,则 Google 提供的 ID 令牌同样可以让您明确肯定该用户拥有电子邮件地址并且是使用该电子邮件地址登录当前设备。除了视为密码之外,您还可以将 ID 令牌的存在视为一种避免密码破解和滥用的信号。


我们发现,大多数 Android 用户使用登录其设备的电子邮件地址作为第三方应用的帐户,这意味着您的大部分返回用户可以实现无缝登录,新用户可以一键创建新帐户!


代码示例和用户流程

下面简要说明如何精简您的应用登录流程:

当您的应用启动时,请求已储存的 Smart Lock 凭据,并在可能的情况下直接转至用户的内容。创建索取密码或 Google 凭据的请求,然后侦听包含请求结果的回调。如果已储存的用户凭据(用户名/密码、ID 令牌等)可用,则立即登录。

  1. CredentialRequest request = new CredentialRequest.Builder()  
  2.      .setSupportsPasswordLogin(true)  
  3.      .setAccountTypes(IdentityProviders.GOOGLE) // you can add other identity providers, too  
  4.      .build();  
  5. Auth.CredentialsApi.request(mCredentialsApiClient, request).setResultCallback(  
  6.      new ResultCallback<CredentialRequestResult>() {  
  7.        public void onResult(CredentialRequestResult result) {  
  8.          if (result.getStatus().isSuccess()) {  
  9.           handleCredential(result.getCredential()) // sign in automatically!
复制代码

如果用户希望或需要使用其电子邮件地址进行登录,则显示选择器以帮助他们输入电子邮件地址。创建索取提示的请求,向系统传递用于显示 UI 的控件,并在用户选择条目时处理请求结果。

  1. HintRequest hintRequest = new HintRequest.Builder()  
  2.      .setEmailAddressIdentifierSupported(true)  
  3.      .setAccountTypes(IdentityProviders.GOOGLE)  
  4.      .build();  
  5. PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(mCredentialsApiClient,   
  6.                                  hintRequest);  
  7. startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);  
  8. ...  
  9. onActivityResult(int requestCode, int resultCode, Intent data) {  
  10.    switch (requestCode) {  
  11.      case RC_HINT:  
  12.        if (resultCode == RESULT_OK) {  
  13.          Credential hint = data.getParcelableExtra(Credential.EXTRA_KEY);  
  14.          handleCredential(hint);
复制代码

提示请求结果将包含用户的选定标识符,如果是设备上的 Google 帐户,则还包含一个 ID 令牌。如果您使用 ID 令牌,则须将其发送至您的服务器并进行验证,以确保安全。请注意,如果电子邮件地址通过验证,此令牌还会包含一条相应的声明,因此您可以跳过任何电子邮件验证步骤。如果没有令牌,或者您无法进行服务器端验证,则仅为用户预填充电子邮件字段。

  1. handleCredential(Credential credential) {  
  2.    if (!credential.getIdTokens().isEmpty()) {  
  3.      credential.getIdTokens().get(0).getIdToken(); // send the ID token string to your server  
  4.    } else {  
  5.      // otherwise, try fill the sign-in form fields and submit if password is available  
  6.      mEmailField.setText(credential.getId());  
  7.      mPasswordField.setText(credential.getPassword());
复制代码

在您的服务器端验证 ID 令牌后,即可使用该令牌创建一个帐户或完成用户登录,无需用户提供密码。Google 提供了多个用于执行令牌验证的库,或者,您可以使用开源实现。ID 令牌包含用户的电子邮件地址,您可以在您的数据库中查找此地址以判断是否需要创建帐户。

  1. <blockquote>GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)  
复制代码

然后,在 Smart Lock 中保存用户的电子邮件地址凭据“提示”,以便下次自动登录。只需使用此提示调用 Credentials API save 方法,并设置用户输入的密码或设置帐户类型(如果您已使用 ID 令牌完成用户登录)。

  1. <blockquote>Credential credential = new Credential.Builder(hint)  
复制代码
了解详情

如需详细了解 Smart Lock API 集成的基本信息,请查看我们的代码实验室,获取逐步指南。我们很高兴能够通过 Smart Lock 实现无需密码即可进行身份验证,我们期待这样一个世界的到来:不仅能够更有效地管理凭据,而且应用可以快速且安全地完成用户登录和注册,并消除键入用户名和密码的困惑。我们希望听到您的反馈问题Blog链接


ChinaGDG.com
回复

使用道具 举报

2#
发表于 2016-2-25 15:15:15 | 只看该作者
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)  
         .setIssuer("https://accounts.google.com")  
         .setAudience(Arrays.asList(String.format("android://%s@%s",   
                             SHA512_HASH, PACKAGE_NAME)))  
         .build();  
...  
     GoogleIdToken idToken = verifier.verify(idTokenString);  
     if (idToken == null) {  
       Log.w(TAG, "ID Token Verification Failed, check the README for instructions.");  
       return;  
     }  
     GoogleIdToken.Payload payload = idToken.getPayload();  
     Log.d(TAG, "IdToken:Email:" + payload.getEmail());  
     Log.d(TAG, "IdToken:EmailVerified:" + payload.getEmailVerified());  
     // based on the email address, determine whether you need to create account   
     // or just sign user in  
ChinaGDG.com
回复 支持 反对

使用道具 举报

3#
发表于 2016-2-25 15:15:47 | 只看该作者
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)  
         .setIssuer("https://accounts.google.com")  
         .setAudience(Arrays.asList(String.format("android://%s@%s",   
                             SHA512_HASH, PACKAGE_NAME)))  
         .build();  
...  
     GoogleIdToken idToken = verifier.verify(idTokenString);  
     if (idToken == null) {  
       Log.w(TAG, "ID Token Verification Failed, check the README for instructions.");  
       return;  
     }  
     GoogleIdToken.Payload payload = idToken.getPayload();  
     Log.d(TAG, "IdToken:Email:" + payload.getEmail());  
     Log.d(TAG, "IdToken:EmailVerified:" + payload.getEmailVerified());  
     // based on the email address, determine whether you need to create account   
     // or just sign user in  
ChinaGDG.com
回复 支持 反对

使用道具 举报

4#
发表于 2016-2-25 19:19:58 | 只看该作者
god job!!!
ChinaGDG.com
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表