使用后端服务器进行 Google 身份验证所需的范围
Posted
技术标签:
【中文标题】使用后端服务器进行 Google 身份验证所需的范围【英文标题】:Google Authentication with a Backend Server required Scopes 【发布时间】:2016-01-10 16:04:15 【问题描述】:我正在关注 these instructions (https://developers.google.com/identity/sign-in/android/backend-auth) 以获取要发送到我的后端的 ID 令牌,但是当我设置 String scopes = "audience:server:client_id:" + Service.SERVER_CLIENT_ID;
(是的 SERVER_CLIENT_ID
不是 Android 客户端 ID)时,我无法获得令牌并引发此错误。
E/Login: com.google.android.gms.auth.GoogleAuthException: Unknown
但是,当我改用以下范围时
String scopes = "oauth2:profile email";
我成功获得了“a”令牌,但它没有我预期的那么长,我担心它可能是错误的。
我的问题是……
1) 为什么指南中使用的scopes = "audience:server:client_id:" + SERVER_CLIENT_ID;
不起作用?
2) 我使用String scopes = "oauth2:profile email";
获得的令牌是否可以安全地用于在后端验证用户?
代码如下。
@Override
protected String doInBackground(Void... params)
String accountName = Plus.AccountApi.getAccountName(googleApiClient);
Account account = new Account(accountName, GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
//String scopes = "oauth2:profile email";
String scopes = "audience:server:client_id:" + Service.SERVER_CLIENT_ID; // Not the app's client ID.
Log.d(TAG, "Account Name: " + accountName);
Log.d(TAG, "Scopes: " + scopes);
try
userIdToken = GoogleAuthUtil.getToken(getApplicationContext(), account, scopes);
return userIdToken;
catch (IOException e)
Log.e(TAG, "IOError retrieving ID token.", e);
return null;
catch (UserRecoverableAuthException e)
startActivityForResult(e.getIntent(), RC_SIGN_IN);
return null;
catch (GoogleAuthException e)
Log.e(TAG, "GoogleAuthError retrieving ID token.", e);
return null;
【问题讨论】:
【参考方案1】:当您将范围设置为 oauth2:profile 电子邮件时,您会收到一个访问令牌,它不同于 id 令牌。
访问令牌可用于访问 Google API,id 令牌是 JWT,其中包含由 Google 数字签名的用户身份信息。格式不同。如果您尝试使用为 id 令牌提供的示例代码授权访问令牌,您将收到无效错误。
如果您查看 GoogleAuthUtil.getToken() 的文档,您会发现 GoogleAuthException 是一个致命异常,通常由无效范围或无效客户端等客户端错误引起。 https://developers.google.com/android/reference/com/google/android/gms/auth/GoogleAuthUtil#getToken(android.content.Context, android.accounts.Account, java.lang.String, android.os.Bundle)
确保您已在 Google Developer Console 中设置了 App 和 Webserver oAuth2 ID,并且清单中的包名称与您在创建 App ID 时提供的包名称以及 SHA 指纹匹配。使用网络服务器 ID 作为 SERVER_CLIENT_ID。
我将一些示例代码上传到 Github。 https://github.com/kmosdev/google-signin-backend-auth
我从 Google 的示例登录应用开始,并对其进行了修改以添加后端身份验证。更多详细信息在自述文件中。
要检查的另一件事是您在清单文件中拥有正确的权限,但我相信如果这是错误的,您会收到不同的错误:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
【讨论】:
第一关。欢迎来到 ***。第二关给我一秒钟,看看这是否为我指明了正确的方向。 (同时我正在投票) 谢谢!我知道这不是一个完整的答案,但我无法发表评论,我认为有一些信息总比没有好。 绝对!我需要一点时间来整理它。我会更新我的答案并让你知道。 我更新了答案以包含来自 Github 的示例代码。查看自述文件了解详细信息,如有更多问题,请随时提出。以上是关于使用后端服务器进行 Google 身份验证所需的范围的主要内容,如果未能解决你的问题,请参考以下文章
Wildfly 11 Elytron - 基于属性文件的身份验证失败,未安装所需的服务
SQL Server 报告服务的自定义身份验证中的“用户 xxx 没有所需的权限”
如何使用 multipartFormData 和参数上传图像,使用 Alamofire 4.3 请求所需的身份验证
Google 登录 GoogleIdToken 后端验证突然失败