在我的Android游戏中,我使用Google服务获取成就并保存游戏数据。我的Google Api客户端:
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(StartActivity.this)
.addOnConnectionFailedListener(StartActivity.this)
.addApi(Games.API).addScope(Games.SCOPE_GAMES)
.addApi(Drive.API).addScope(Drive.SCOPE_APPFOLDER)
.setViewForPopups(findViewById(android.R.id.content))
.build();
现在我需要在我的服务器上使用谷歌授权。我阅读了谷歌文档(https://developers.google.com/identity/sign-in/android/start)并尝试实现这一点。我将.addApi(Auth.GOOGLE_SIGN_IN_API, geo)
添加到我的google api客户端。如果我使用这个Api,那么我可以在服务器端获得idToken进行验证。但是我收到错误" Auth.GOOGLE_SIGN_IN_API不能与Games.API"一起使用。搜索互联网,我发现我应该只使用Games.API。我是如何在Google开发人员博客(http://android-developers.blogspot.ru/2016/01/play-games-permissions-are-changing-in.html)上找到的,这段代码很好:
GetServerAuthCodeResult result = Games.getGamesServerAuthCode(gac, clientId).await();
if (result.isSuccess()) {
String authCode = result.getCode();
// Send code to server.
}
但不推荐使用GetServerAuthCodeResult
和getGamesServerAuthCode
。并且result.getCode()
总是为我返回null
。获取服务器端身份验证的令牌以及使用Games.API获得成就有什么好处?
答案 0 :(得分:1)
一旦播放器在设备上进行身份验证,就可以实现这一目标: 获取一个授权代码发送到您的后端服务器:
GetServerAuthCodeResult result =
Games.getGamesServerAuthCode(gac, clientId).await();
if (result.isSuccess()) {
String authCode = result.getCode();
// Send code to server.
}
在服务器上,通过将RPC发送到https://www.googleapis.com/oauth2/v4/token来交换为令牌接收的身份验证代码,以交换访问令牌的身份验证代码。
您必须提供服务器客户端ID,服务器客户端密钥(在创建服务器客户端ID时在Developer Console中列出)和身份验证代码。查看更多详情here
获得访问令牌后,将使用访问令牌使用以下网址检索播放器的ID:www.googleapis.com/games/v1/applications//verify/。在标题中传递身份验证令牌,如下所示:Authorization: OAuth
响应值将包含用户的玩家ID。这是用于此用户的正确玩家ID。此访问令牌可用于根据需要进行其他服务器到服务器调用。
答案 1 :(得分:0)
我遇到了同样的问题,result.getCode()
也总是为我回复null
。事实证明,我忘了在Google Developer Console链接应用下创建并链接Web
类型的应用。使用Android
- 类型和Web
类型并使用其完整的客户端ID时,在调用getGamesServerAuthCode(gac, clientId)
时,就可以了。