为什么requestIdToken返回null?

我按照以下步骤作为此链接

  1. 我将google-services.json下载到我的应用程序文件夹中。
  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. 我为后端服务器创build了OAuth 2.0客户端ID,并将此客户端ID传递给strings.xml文件。

  5. 最后,我创build了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。 我在想也许我在第一或第二步做错了什么。 而我的代码几乎类似于这个SignInActivity.java 。 任何帮助,将不胜感激。

正如我在以下问题回答:

Google Sign-In requestIdToken返回null

为了成功请求Id令牌,您应该使用“Web应用程序”types的客户端ID,而不是“Android”types的客户端ID。

您还可以在Google的文档中find以下信息(请注意#3):

为您的后端服务器创build一个OAuth 2.0客户端ID

如果您的应用使用后端服务器进行身份validation或从后端服务器访问Google API,则必须为您的服务器创buildOAuth 2.0客户端ID。 创buildOAuth 2.0客户端ID:

  1. 打开凭证页面。
  2. 点击添加凭据> OAuth 2.0客户端ID。
  3. selectWeb应用程序
  4. 点击创build。

在创buildGoogleSignInOptions对象时,将此客户端ID传递给requestIdTokenrequestServerAuthCode方法。


3月26日更新:

Android开发者博客 – 为Googlelogin注册OAuth客户端

在我以前

  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(); 

现在它为我工作。这可以帮助像我这样的问题。

我们可以使用带有“WebApplication ClientID”的requestServerAuthCode方法,并创build一个方法来获取访问令牌,如下所示:

  new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestServerAuthCode("WEBAPPLICATION CLIENT ID") .requestEmail() .build()) 

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

获取Web应用程序客户端ID如下

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将有不同的类别),或者您可以使用任何networking框架进行上述调用

有了成功的回应,您将在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可供进一步使用。