Android 没有额外权限的 getServerAuthCode()
Android getServerAuthCode() without extra permissions
我正在尝试使用后端服务器对 Android 用户进行身份验证:
- 应用程序调用
getServerAuthCode()
并使用 HTTPS 将授权码转发给我们的 BE
- BE 使用 GoogleAuthorizationCodeTokenRequest
将服务器授权代码交换为访问令牌
- BE 将访问令牌传递给 www.googleapis.com/games/v1/applications returns playerId(这就是我真正需要的,我不知道不关心电子邮件和其他用户信息)
程序概述如下:
- https://android-developers.googleblog.com/2016/01/play-games-permissions-are-changing-in.html (2016)
这里
如果我使用 2017 年的指令,我可以 getServerAuthCode() 而无需请求任何额外权限。唯一的权限是:Google 玩/管理您的游戏 activity 此游戏。这可以通过指定 GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
来实现,它可以通过使用 play-service 10.2.1 获得。由于第 3 方依赖性,我无法使用 10.2.1。
2016 年的文章解释了如何getServerAuthCode()
“旧”方式(使用播放服务 9.6.1),但我无法通过无需请求一些额外的权限。
如果我这样做,我会得到 "Know who you are on google":
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestServerAuthCode(serverClientId)
.requestScopes(Games.SCOPE_GAMES)
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
...
protected void onActivityResult(int request, int response, Intent data) {
super.onActivityResult(request, response, data);
if (request == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
GoogleSignInAccount acct = result.getSignInAccount();
String authCode = acct.getServerAuthCode();
}
如果我从 gso 中删除 .requestServerAuthCode(serverClientId)
,authCode 为空。
我尝试的另一件事(仅使用 Games.API 登录):
mGoogleApiClient = new GoogleApiClient.Builder(this, this, this)
.addApi(Games.API)
.build();
...
Games.GetServerAuthCodeResult result = Games.getGamesServerAuthCode(mGoogleApiClient, serverClinetId).await();
if (result.getStatus().isSuccess()) {
String authCode = result.getCode();
我得到 result.getStatus().isSuccess()=false
和 result.getStatus().getStatusMessage()
returns STATUS_CLIENT_RECONNECT_REQUIRED (2)
。在日志中我看到:
[GetToken] GetToken failed with status code: NeedPermission
04-10 14:27:41.764: W/GamesServerAuthCodeOp(5775): Failed to retrieve the server auth code
04-10 14:27:41.764: W/GamesServerAuthCodeOp(5775): com.google.android.gms.auth.UserRecoverableAuthException: NeedPermission
最后,我能做到的最好的事情就是获得 'only' "View your basic profile info" 权限:
Scope scope = new Scope("https://www.googleapis.com/auth/userinfo.profile");
mGoogleApiClient = new GoogleApiClient.Builder(this, this, this)
.addApi(Games.API)
.addScope(scope)
.build();
所以回顾一下 - 我想使用 9.6.1 获取服务器授权代码而不提示任何额外权限(就像在 2017 年的文章中使用 10.2.1 使用 DEFAULT_GAMES_SIGN_IN
)。
是否有任何我可以使用的范围可以在不请求额外权限的情况下为我提供服务器授权代码(以获取 playerId)?
很遗憾,没有。您已经在使用的范围是检索授权代码并同时获得 playerId
.
的正确(也是最简单)方法
我正在尝试使用后端服务器对 Android 用户进行身份验证:
- 应用程序调用
getServerAuthCode()
并使用 HTTPS 将授权码转发给我们的 BE - BE 使用 GoogleAuthorizationCodeTokenRequest 将服务器授权代码交换为访问令牌
- BE 将访问令牌传递给 www.googleapis.com/games/v1/applications returns playerId(这就是我真正需要的,我不知道不关心电子邮件和其他用户信息)
程序概述如下:
- https://android-developers.googleblog.com/2016/01/play-games-permissions-are-changing-in.html (2016)
这里
如果我使用 2017 年的指令,我可以 getServerAuthCode() 而无需请求任何额外权限。唯一的权限是:Google 玩/管理您的游戏 activity 此游戏。这可以通过指定 GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
来实现,它可以通过使用 play-service 10.2.1 获得。由于第 3 方依赖性,我无法使用 10.2.1。
2016 年的文章解释了如何getServerAuthCode()
“旧”方式(使用播放服务 9.6.1),但我无法通过无需请求一些额外的权限。
如果我这样做,我会得到 "Know who you are on google":
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestServerAuthCode(serverClientId)
.requestScopes(Games.SCOPE_GAMES)
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
...
protected void onActivityResult(int request, int response, Intent data) {
super.onActivityResult(request, response, data);
if (request == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
GoogleSignInAccount acct = result.getSignInAccount();
String authCode = acct.getServerAuthCode();
}
如果我从 gso 中删除 .requestServerAuthCode(serverClientId)
,authCode 为空。
我尝试的另一件事(仅使用 Games.API 登录):
mGoogleApiClient = new GoogleApiClient.Builder(this, this, this)
.addApi(Games.API)
.build();
...
Games.GetServerAuthCodeResult result = Games.getGamesServerAuthCode(mGoogleApiClient, serverClinetId).await();
if (result.getStatus().isSuccess()) {
String authCode = result.getCode();
我得到 result.getStatus().isSuccess()=false
和 result.getStatus().getStatusMessage()
returns STATUS_CLIENT_RECONNECT_REQUIRED (2)
。在日志中我看到:
[GetToken] GetToken failed with status code: NeedPermission
04-10 14:27:41.764: W/GamesServerAuthCodeOp(5775): Failed to retrieve the server auth code
04-10 14:27:41.764: W/GamesServerAuthCodeOp(5775): com.google.android.gms.auth.UserRecoverableAuthException: NeedPermission
最后,我能做到的最好的事情就是获得 'only' "View your basic profile info" 权限:
Scope scope = new Scope("https://www.googleapis.com/auth/userinfo.profile");
mGoogleApiClient = new GoogleApiClient.Builder(this, this, this)
.addApi(Games.API)
.addScope(scope)
.build();
所以回顾一下 - 我想使用 9.6.1 获取服务器授权代码而不提示任何额外权限(就像在 2017 年的文章中使用 10.2.1 使用 DEFAULT_GAMES_SIGN_IN
)。
是否有任何我可以使用的范围可以在不请求额外权限的情况下为我提供服务器授权代码(以获取 playerId)?
很遗憾,没有。您已经在使用的范围是检索授权代码并同时获得 playerId
.