为什么requestIdToken返回null?

时间:2015-12-05 23:04:30

标签: android google-signin

我关注below steps as this link

  1. 我将google-services.json下载到我的app文件夹。
  2. 我的项目级别gradle文件:

    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.google.gms:google-services:1.5.0-beta2'
    }
    
  3. 我的应用级Gradle文件:

    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services'
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile 'com.google.android.gms:play-services-identity:8.3.0'
        compile 'com.google.android.gms:play-services:8.3.0'
        compile 'com.google.android.gms:play-services-plus:8.3.0'
        compile 'com.google.android.gms:play-services-auth:8.3.0'
        ...
    }
    
  4. 我为后端服务器创建了OAuth 2.0客户端ID,并将此客户端ID传递给strings.xml文件。

  5. 最后我创建了GoogleSignInOptions和GoogleApiClient对象,如下所示:

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestIdToken(getString(R.string.server_client_id))
            .build();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
    

    但问题是result.isSuccess()总是在handleSignInResult函数中返回false。我想也许我在第1步或第2步错误地做某事。我的代码与此SignInActivity.java几乎相似。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:39)

正如我在以下问题中所说:

  

Google Sign-In requestIdToken returns null

为了成功请求Id Token,您应该使用" Web应用程序"输入客户端ID,而不是" Android"输入客户ID。

您还可以在Google's documentation找到以下信息(请注意#3):

  

为后端服务器创建OAuth 2.0客户端ID

     

如果您的应用使用后端服务器进行身份验证或访问Google   来自后端服务器的API,您必须创建OAuth 2.0客户端ID   为您的服务器。要创建OAuth 2.0客户端ID:

     
      
  1. 打开“凭据”页面。
  2.   
  3. 点击添加凭据> OAuth 2.0客户端ID。
  4.   
  5. 选择 Web应用程序
  6.   
  7. 点击“创建”。
  8.         

    将此客户端ID传递给 requestIdToken 或   创建GoogleSignInOptions对象时的 requestServerAuthCode 方法。

3月26日更新:

  

Android Developers Blog - Registering OAuth clients for Google Sign-In

答案 1 :(得分:18)

在我的情况下,我有以前 y,

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

我通过添加requestToken方法

来修复它
 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestIdToken(getString(R.string.default_web_client_id))
            .build();

现在它为我工作。希望这可以帮助像我这样的人。

答案 2 :(得分:1)

我们可以将 requestServerAuthCode 方法与“WebApplication ClientID”一起使用,并创建一个方法来获取访问令牌,如下所示;

 new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)

                    .requestServerAuthCode("WEBAPPLICATION CLIENT ID")

                    .requestEmail()

                    .build())

如我们所见,我们需要一个WEBAPPLICATION客户端ID,我们可以从中获取 https://console.developers.google.com;

obtain web application client id as follows

void fetchGoogleAuthToken(){

    OkHttpClient okHttpclient = new OkHttpClient();
    RequestBody requestBody = new FormEncodingBuilder()
            .add("grant_type", "authorization_code")
            .add("client_id", "812741506391-
              h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com")
            .add("client_secret", "{clientSecret}")
            .add("redirect_uri","")
            .add("code", "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8")
            .build();

    final Request request = new Request.Builder()
            .url("https://www.googleapis.com/oauth2/v4/token")
            .post(requestBody)
            .build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(final Request request, final IOException e) {
            Log.e(LOG_TAG, e.toString());                
        }

        @Override
        public void onResponse(Response response) throws IOException {
            try {
                JSONObject jsonObject = new 
                             JSONObject(response.body().string());
                final String message = jsonObject.toString(5);
                Log.i(LOG_TAG, message);                    
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
}

请使用编译'com.squareup.okhttp:okhttp:2.6.0'(版本3-RC1将有不同的类)或者您可以使用任何网络框架进行上述调用

如果响应成功,您将在log-cat中获得以下信息:

I/onResponse: {
          "expires_in": 3600,

          "token_type": "Bearer",

          "refresh_token": "1\/xz1eb0XU3....nxoALEVQ",

          "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxMWY1Ym......yWVsUA",

     **"access_token": "ya29.bQKKYah-........_tkt980_qAGIo9yeWEG4"**
     }

因为可以看到 acces_token 可供进一步使用。

答案 3 :(得分:0)

我面临着同样的问题。我所做的只是简单地再次下载 google-services.json 文件,替换了旧的文件就可以了。 不知道为什么会这样,我的猜测已经改变了,在覆盖之前我忘了比较。