为什么GetServerAuthCodeResult被弃用了?在已安装的应用程序中如何实现等效功能?

18

根据这篇文章:http://android-developers.blogspot.com/2016/01/play-games-permissions-are-changing-in.html,我已经获取了一个单次使用的授权码,用于我的后端服务器,如下所示:

import com.google.android.gms.games.Games;    
//later
Games.GetServerAuthCodeResult result = Games.getGamesServerAuthCode(gameHelper.getApiClient(), server_client_id).await(); 
if (result.getStatus().isSuccess()) {
    String authCode = result.getCode();
    // Send code to server...

这似乎运作良好,但它提出了一个问题:

1)getGamesServerAuthCode 和 GetServerAuthCodeResult 被标记为已弃用。为什么?我应该使用其他东西吗?

2)如何在未安装 Android 的 Java 应用程序中等效地执行某些操作?我能够在客户端应用程序上获取令牌,但我还需要获取单个使用代码以传递给我的后端服务器,就像上面所示。我找不到等效的函数来获取服务器授权码。(使用com.google.api.client.extensions.java6.auth.oauth2)

基本上,我正在尝试遵循此流程:https://developers.google.com/games/services/web/serverlogin,但是在Java中,而不是JavaScript。我正在尝试在Android应用程序和桌面Java应用程序中执行此操作。


1
一个被注解为@Deprecated的程序元素是程序员不建议使用的,通常是因为它很危险,或者有更好的替代方案。编译器会在非废弃代码中使用或覆盖已废弃的程序元素时发出警告。这并不意味着它将消失、被删除或以任何方式被移除,而是意味着有更好的方法来完成它。不要惊慌,保持冷静并继续前进 ;O) - Jon Goodwin
我理解这一点。我正在寻找在Android中做事情的“正确”方式,因为最近(1月份)谷歌建议使用此函数。我还面临一个额外的问题,即在非Android版本的Java API中不存在可比较的函数。 - M1LKYW4Y
1
@M1LKYW4Y 你在(1)中找到了想要的“正确”方法吗?我在开发中也正好遇到同样的问题。谷歌最近似乎推荐了这种方法,但是这种方法似乎已经被弃用了! - user1300214
不,我仍在Android中使用已弃用的方法来生成服务器的单次使用代码。桌面版更糟糕,我必须将令牌本身发送到我的服务器。 - M1LKYW4Y
@M1LKYW4Y 我一直无法让它工作,result.getStatus().isSuccess() 总是为 false,你有什么建议或提示吗?这对你仍然有效吗? - mhilmi
弃用的代码仍然可以工作,这里是Android端的代码片段。http://pastebin.com/7ztaHFgJ 请注意,server_client_id是服务器应用程序的客户端ID,为了使其正常工作,服务器必须在Google Play Games链接的Web应用程序类型的关联应用程序中注册(我相当确定其他类型将无法工作)。 - M1LKYW4Y
2个回答

0

这个问题的第一部分终于有了一个正确的答案!在gms 10.2.0的发布说明中https://developers.google.com/android/guides/releases#february_2017_-_v102,描述了获取服务器代码的新方法。这里提供了如何实现的良好示例:https://github.com/playgameservices/clientserverskeleton
最终我更新了Google的baseGameUtils以遵循上述示例。

对于问题的第二部分仍然不确定正确的方法,目前我正在将令牌发送到服务器,虽然可以工作但可能不安全。


0

1) 是的,在Android中使用GetServerAuthCodeResult,尽管它仍被标记为弃用。这是Google推荐的方式,似乎他们在发布给公众时只是忘记移除弃用注释。

2) 对于桌面应用程序,您可以按照此处的说明进行操作:https://developers.google.com/identity/protocols/OAuth2InstalledApp

基本上,从您的应用程序中打开系统浏览器(不建议使用嵌入式 Web 视图),并向 https://accounts.google.com/o/oauth2/v2/auth 端点发出 https 请求。在请求中,您提供一个本地重定向 URI 参数,即 http://127.0.0.1:9004(您应查询平台以获取相关的回送 IP,并在随机可用端口上启动 HTTP 监听器)。当用户已经同意或拒绝请求时,授权代码将被发送到您的本地 HTTP 监听器,例如 error=access_denied。您的应用程序必须在此本地 Web 服务器上侦听以检索带有 authcode 的响应。您还可以选择直接重定向到由您的应用程序声明的服务器 URI,请参见上面的链接文档。当您的应用程序接收到授权响应时,为了获得最佳的可用性,它应该响应一个 HTML 页面,指示用户关闭浏览器选项卡并返回您的应用程序。此外,如果您想要 Games-scope,请确保在请求中使用 https://www.googleapis.com/auth/games 作为范围,以下是示例,包含换行和空格以提高可读性。

https://accounts.google.com/o/oauth2/v2/auth?
  scope=https://www.googleapis.com/auth/games&
  redirect_uri=http://127.0.0.1:9004&
  response_type=code&
  client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com

请注意,我认为您需要在Google Play开发者控制台的链接应用程序中创建和链接一个类型为other的应用程序,以使本地主机重定向正常工作。如果计划直接重定向到服务器URI,请使用类型Web,并将您的服务器URI添加到API管理器下的Credentials部分中的Authorized redirect URIs中。
浏览器截图:

consent picture


请原谅我的谨慎,但您如何知道1)中的代码确实是Google推荐的,而弃用是不正确的?您的来源是否与我在顶部链接的文章相同? - M1LKYW4Y
1
我不确定,因此使用了“似乎”,但这是Google的开发者计划工程师Clayton Wilkinson所说的:“处理这个问题的最佳方法是…”和“它将成为一个普通的API”。之后Google没有关于这个问题发布任何其他公告。此外,这目前是在Android上获取授权码的唯一方法,我怀疑他们不会很快删除它。这将破坏很多游戏,因为它们依赖于运行自己的服务器后端来运行此登录功能。 - jbilander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接