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

2016 年 Play Games 权限将发生变化

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



我们正在采取措施,通过将 Games API 转移到新模型来减少登录摩擦以及向玩家提出的不必要权限请求。新的互动方式如下:
  • 提示玩家每个帐户登录一次,而不是原来的每个游戏登录一次
  • 玩家不再需要将帐户升级到 Google+ 来使用 Play Games 服务
  • 玩家首次登录后,更换游戏时无需再次登录;他们将自动登录游戏
  • 注:玩家可通过 Play Games 应用的设置关闭自动登录

优点:
  • 用户首次登录后,一般情况下用户无需与系统进行任何互动便可登录新游戏
  • 登录任何游戏都无需显示同意屏幕。每个新游戏的登录均自动完成。

为尊重用户的隐私权和避免泄露其真实姓名,我们还必须更改玩家 ID 的工作方式。
  • 对于现有玩家: 游戏将在其登录时继续获取其 Google+ ID(在旧版文档中也称为“玩家 ID”)。
  • 对于新玩家: 游戏将获取新的玩家 ID,它不同于我们以前使用的 ID。

潜在问题
大多数游戏应该不会出现服务中断或变更情况。但在少数情况下需要进行一定程度的变更。

以下是一些问题以及可能的解决方案。

这些问题是

1. 不必要地询问 Google+ 作用域
  • 问题:系统将不必要地向您的用户显示可能造成干扰的同意弹窗
  • 解决方案:仅在绝对必要时才请求附加作用域


2. 为其他并非游戏的 Google API 使用 Play Games 玩家 ID
  • 问题:您将无法从这些其他端点获得有效的返回数据。
  • 解决方案:不为其他 Google API 使用玩家 ID。


3. 使用服务器上的移动/客户端访问令牌
  • 问题:您的访问令牌不一定包含您要寻找的信息
    …首先不推荐这样做。
  • 解决方案:改用新增的 GetServerAuthCode API。

让我们逐一详述这些问题。

问题:询问不必要的作用域
我们早期版本的示例和文档按以下方式创建 GoogleApiClient :
  • // Don’t do it this way!  
  • GoogleApiClient gac = new GoogleApiClient.Builder(this, this, this)  
  •            .addApi(Games.API)  
  •            .addScope(Plus.SCOPE_PLUS_LOGIN) // The bad part  
  •            .build();  
  • // Don’t do it this way

在此情况下,开发者明确请求 plus.login 作用域。 如果您询问 plus.login,系统将向用户显示同意对话框。

解决方案:只询问您需要的作用域
从您的 GoogleApiClient 结构中移除任何多余的作用域以及您不再使用的 API。
  • // This way you won’t get a consent screen  
  • GoogleApiClient gac = new GoogleApiClient.Builder(this, this, this)  
  •            .addApi(Games.API)  
  •            .build();  
  • // This way you won’t get a consent screen


对于 Google+ 用户
如果您的应用使用特定 Google+ 功能,如要求访问玩家的现实世界 Google+ 社交图谱,请注意,新用户仍需拥有 G+ 个人资料,才能使用您的游戏。(将不会要求已经登录的现有用户再次同意)。

如需要求具备 Google+ 帐户才能使用您的游戏,请对您的 Games.API 声明做以下更改:
  • .addApi(Games.API, new GamesOptions.Builder()  
  •                        .setRequireGooglePlus(true).build())  


这可以确保您的游戏仍然会询问必要的权限/作用域,以便继续使用玩家的现实世界社交图谱和真实姓名个人资料。

问题:将玩家 ID 作为其他 ID 使用
如果您调用 Games.getCurrentPlayerId() API,此处返回的值将是 Games 为该玩家使用的标识符。

在传统模型下,可将该值传递到 Plus.PeopleApi.load 等其他 API 中。 在新模型下则不再是这种情况。 玩家 ID 仅在与 Games API 一起使用时有效。

解决方案 – 不要混用 ID
Games API(那些从 com.google.android.gms.games 访问的 API) 都使用玩家 ID,只要您只使用这些 API,它们就一定能与新 ID 配合使用。

问题:使用服务器上的移动/客户端访问令牌
我们见过的一种常见模式是:
  • 使用 GoogleAuthUtil 获得访问令牌
  • 将该令牌发送至服务器
  • 在服务器上,调用 Google 来验证真伪。最常用的验证方法是调用
    https://www.googleapis.com/oauth2/v1/tokeninfo  并查看响应


首先并不推荐这样做,在作用域发生变化后这样做就更不可取。

不推荐的原因如下:
  • 您的应用必须了解用户当前使用的帐户,也就是说,应用必须拥有 GET_ACCOUNTS 权限。在 Android M 上,这会导致要求用户在运行时与您的应用共享其联系人,让用户感到畏惧。
  • tokeninfo 端点实际上并非针对这一用例开发—其主要设计用途是作为调试工具而非生产 API 使用。这意味着,如果您调用该 API,未来可能会受到请求率限制。
  • 在新模型下,tokeninfo 返回的 user_id 可能不再存在。即便仍然存在,其值也不会与新玩家 ID 相同。(见上文的问题 2)
  • 令牌可能随时到期(无法保证访问令牌到期时间)。
  • 在服务器上使用客户端令牌需要进行额外的验证检查,以确保未将令牌授予其他应用。


解决方案:使用新的 GetServerAuthCode 流程
幸运的是,已经找到了解决方案,并且其内容与我们针对 Web 的服务器端身份验证建议基本相同。

1. 升级到最新版本的 Google Play Services SDK—至少要升级到 8.4.87。
2. 如果您尚未创建服务器客户 ID,请创建一个
    a) 转至 Google Developer Console,并选择您的项目    b) 从左侧导航栏选择 API Manager,然后选择 Credentials    c) 依次选择“New Credentials”和“OAuth Client ID”    d) 选择“Web Application”并为其指定对您的应用有意义的名称    e) 现在这个 Web 应用的客户 ID 即是您的服务器客户 ID。
3. 在您的游戏中,照常连接 GoogleApiClient。

4. 建立连接后调用以下 API:
    a) Games.getGamesServerAuthCode(googleApiClient, “your_server_client_id”)
    b) 如果您以前使用的是 GoogleAuthUtil,很可能是在后台线程中调用该 API—在这种情况下,代码将如下所示:
  • // Good way  
  • {  
  •       GetServerAuthCodeResult result =   
  •            Games.getGamesServerAuthCode(gac, clientId).await();  
  •       if (result.isSuccess()) {  
  •            String authCode = result.getCode();  
  •             // Send code to server.  
  •    }  
  • }  
  • // Good way  


5. 按照与以前完全相同的方式将身份验证代码发送至您的服务器。
6. 在您的服务器上,对  https://www.googleapis.com/oauth2/v4/token 进行 RPC 调用,用身份验证代码换取访问令牌,此时可能需要使用 Google API 客户端内容库。
    a) 您需要提供服务器客户 ID、服务器客户密钥(当您创建服务器客户 ID 时,会在开发者控制台中列出)和身份验证代码。    b) 更多详情,请参阅此处: https://developers.google.com/id ... er#handlingresponse    c) 不,实际上: 您应该使用 Google API 客户端内容库来简化这一过程。
7. 获得访问令牌后,您现在可以使用它来调用
www.googleapis.com/games/v1/applications/<app_id>/verify/
    a) 如下所示在标头中传递身份验证令牌:“Authorization:OAuth <access_token>”    b) 响应值将包含该用户的玩家 ID。这便是供该用户使用的正确玩家 ID。
    c) 可根据需要使用该访问令牌进行额外的服务器到服务器调用。

注: 如果访问令牌实际上是发放给您的 Web 应用,则此 API 将只返回 200。

总结
可以非常明确的是:如果您不做任何调整,除非您显式地依赖 Google+ 功能,否则不会发现任何功能上的变化,并且登录体验会变得更加顺畅。

如果您:
  • 请求 Google+ 作用域却不加使用,最好从现在开始停止使用它们。
  • 向您的服务器发送客户端访问令牌,我们强烈建议您改用 getGamesServerAuthCode() 。

谢谢,请继续开发出色的游戏!

ChinaGDG.com
回复

使用道具 举报

2#
发表于 2016-12-1 00:31:56 | 只看该作者
请问这个是谷歌目前最新的解决方案吗?也就是你说的第7步使用
获得访问令牌后,您现在可以使用它来调用
www.googleapis.com/games/v1/applications/<app_id>/verify/
是这样吗?
ChinaGDG.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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