如果我在Android中使用Games.API,如何获取服务器的访问令牌?

时间:2016-08-25 12:29:29

标签: android api google-play-services

在我的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.  
}

但不推荐使用GetServerAuthCodeResultgetGamesServerAuthCode。并且result.getCode()总是为我返回null。获取服务器端身份验证的令牌以及使用Games.API获得成就有什么好处?

2 个答案:

答案 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)时,就可以了。