在我的Android游戏中,我使用Google Services获取成就并保存游戏数据。我的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一起使用"。在互联网上搜索,我发现我应该只使用game . api。我是如何在谷歌开发者博客(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
。什么方式是好的获得令牌为服务器端认证,也使用游戏。成就API ?
当玩家在设备上通过身份验证时,我们需要做的是:获取要发送到后端服务器的验证码:
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中列出)和验证码。在这里查看更多细节
一旦你有访问令牌,玩家的ID是检索使用:www.googleapis.com/games/v1/applications//verify/使用访问令牌。在报头中传递验证令牌如下:Authorization: OAuth
响应值将包含用户的播放器ID。这是该用户使用的正确的玩家ID。此访问令牌可用于根据需要进行额外的服务器到服务器调用。
我也有同样的问题,result.getCode()
总是为我返回null
。原来我忘了在Google Developer Console链接应用下创建和链接Web
类型的应用。使用Android
类型和Web
类型并使用其完整的客户端ID,在调用getGamesServerAuthCode(gac, clientId)
时,就完成了这个任务。