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

Google 帐号登录 API 更新

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

英文原文:API Updates for Sign-In with Google

随着 Google Play service 8.3 的发布,我们对 Sign-In with Google(使用 Google 登录)做出了大量的改进。在本系列的第一篇博文中,我们介绍了用户界面的改进。今天,我们将继续探讨对 API 的改进,这些改进让开发使用 Google 登录的应用变得比以前更简单。

对基本登录流程的变动

在开发使用 Google 登录的应用时,您会注意到有许多变动让您的代码更容易理解和维护。

在此版本之前,如果您开发使用 Sign-In with Google 的应用,您开发的应用会尝试连接到 GoogleApiClient。此时,系统会向用户显示一个帐户选取器和/或权限对话框,这两者都可能触发连接故障。您可能不得不处理这些连接故障才能登录。连接 GoogleApiClient 之后,用户会被视为已登录,系统即会授予其权限。该流程记载在此处的 CodeLab 中。

现在,您的代码可以大大简化。

系统会分别处理登录和连接 GoogleApiClient 的流程。登录通过 GoogleSignInOptions 对象实现,您可以对其指定登录参数,例如,您想要的登录作用域。以下是一段示例代码:

  1. <blockquote>GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)  
复制代码

建立 GoogleSignInOptions 对象之后,即可使用它来配置 GoogleApiClient:

这里正是您的代码在新的 API 中改变巨大之处。现在,如果您想使用 Google 帐户连接,您将使用利用客户端初始化的 Intent,而不必处理 GoogleApiClient 上的错误。

  1. Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
  2. startActivityForResult(signInIntent, RC_SIGN_IN);

  3. Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
  4. startActivityForResult(signInIntent, RC_SIGN_IN);
复制代码

启动该 Intent 将会向您显示帐户选取器以及作用域权限对话框(倘若您的 GoogleSignInOptions 请求的作用域超出基本作用域的范畴之外)。用户完成与这些对话框的交互之后,即会触发 OnActivityResult 回调,该回调包含必要的登录信息。

  1. @Override  
  2. public void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.    super.onActivityResult(requestCode, resultCode, data);  
  4.    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);  
  5.    if (requestCode == RC_SIGN_IN) {  
  6.      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);  
  7.      handleSignInResult(result);  
  8.    }  
  9. }
复制代码

集成 Google Sign-In 快速入门中或者通过查看此示例代码,您可以了解到有关此代码的更多信息。

静默式登录

为进一步减少用户在多设备环境中的困惑,新版 API 还支持静默式登录。这种情况下,如果您的用户在另一设备上授权该应用,则该帐户后面会显示详细登录信息,除非他们撤销授权,否则,他们不需要在其今后登录的设备上再重复提供这些信息。现有登录信息也会被缓存,并可同步到当前可用的设备上。

使用它就像在此 API 中调用 silentSignIn 方法一样简单。

  1. OptionalPendingResult opr =
  2.       Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
复制代码

随后,您可以检查 isDone() 方法的处理结果,如果返回 True,则说明该用户已登录,您可以从 PendingResult 获取其状态。否则,则必须等待回调 SignInResult

  1. if (pendingResult.isDone()) {  
  2.     doStuffWith(pendingResult.get());  
  3.   } else {  
  4.     // There's no immediate result ready, displays some progress indicator and waits for the  
  5.     // async callback.  
  6.     showProgressIndicator();  
  7.     pendingResult.setResultCallback(new ResultCallback<GoogleSignInResult>() {  
  8.       @Override  
  9.       public void onResult(@NonNull GoogleSignInResult result) {  
  10.         updateButtonsAndStatusFromSignInResult(result);  
  11.         hideProgressIndicator();  
  12.       }  
  13.     });  
  14.   }
复制代码
自定义登录按钮

在开发使用 Google 登录的应用时,我们提供了一个 SignInButton 对象,该对象包含 Google 品牌标识,看上去像下面这样:


此 API 中提供了许多属性和常量,可用来自定义该按钮,详见此处

品牌指南可从此处获取,它们包含 PNG、SVG、EPS 和其他格式、多种分辨率的按钮版本,包括按钮的所有不同状态。这些文件可用于本地化该按钮,如果您需要让按钮的样式与您的应用相匹配,也可以参考提供的相关指南。

这仅仅处理了应用的 Android 端。您很可能还拥有服务器后端,您可能希望在服务器端安全地使用这些凭据。

在下一篇博文中,我们将介绍如何在服务器端场景中使用 Sign-In with Google,包括如何将您的凭据安全地传输到您自己的服务器上,以及如何利用用户的权限和凭据使用 Google 后端服务(例如 Google Drive)。

Blog地址
ChinaGDG.com
回复

使用道具 举报

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

本版积分规则

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