cover_image

【开发技术】为什么说 Smart Lock 是 Smart 的?

DevRel 谷歌开发者 2016年02月25日 10:38

依托 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 的更多信息,请访问我们的开发者网站

图片
Smart Lock for Passwords更多信息,请访问:

developers.google.com/identity/smartlock-passwords/android/overview


新版特性
Smart Lock

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

图片


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


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


检索登录“提示”方法,请访问:

developers.google.com/identity/smartlock-passwords/android/retrieve-hints


完全跳过密码
Smart Lock

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


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


代码示例和用户流程 
Smart Lock

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

图片

当您的应用启动时,请求已储存的 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. GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)  

  2.          .setIssuer("https://accounts.google.com")  

  3.          .setAudience(Arrays.asList(String.format("android://%s@%s",   

  4.                              SHA512_HASH, PACKAGE_NAME)))  

  5.          .build();  

  6.  ...  

  7.      GoogleIdToken idToken = verifier.verify(idTokenString);  

  8.      if (idToken == null) {  

  9.        Log.w(TAG, "ID Token Verification Failed, check the README for instructions.");  

  10.        return;  

  11.      }  

  12.      GoogleIdToken.Payload payload = idToken.getPayload();  

  13.      Log.d(TAG, "IdToken:Email:" + payload.getEmail());  

  14.      Log.d(TAG, "IdToken:EmailVerified:" + payload.getEmailVerified());  

  15.      // based on the email address, determine whether you need to create account   

  16.      // or just sign user in  


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

  1. Credential credential = new Credential.Builder(hint)  

  2.      // if you signed in with ID token,   

  3.      // set account type to the URL for your app (instead of a password field)  

  4.      //.setAccountType("https://yourdomain.com")   

  5.      .setPassword(password)  

  6.      .build();  

  7.  Auth.CredentialsApi.save(mCredentialsApiClient, credential).setResultCallback(  

  8.      new ResolvingResultCallbacks<Status>(this, RC_SAVE) 


了解详情 
Smart Lock

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


了解Smart Lock API 集成,请访问:

codelabs.developers.google.com/codelabs/android-smart-lock/index.html

提出您的问题:

stackoverflow.com/questions/tagged/google-smartlockpasswords


原文来自【安卓开发者全球博客】

android-developers.blogspot.com

中文翻译文章【中国谷歌开发者论坛】(文末阅读原文):

chinagdg.com/thread-31978-1-1.html


图片

图片

微信扫一扫
关注该公众号

继续滑动看下一个
谷歌开发者
向上滑动看下一个