使用后端服务器的Google身份验证需要范围

时间:2015-10-13 03:28:23

标签: java android authentication google-signin google-identity

我正在关注these instructionshttps://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";

我成功地获得了'一个'令牌,但它没有我预期的那么长,我担心这可能是错的。

我的问题是......

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 个答案:

答案 0 :(得分:2)

当你将范围设置为oauth2:profile email时,你会收到一个访问令牌,它与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指纹相匹配。使用Web服务器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" />