如何使用GoogleSignInAccount对Google的REST服务进行身份验证?

时间:2018-09-08 19:38:24

标签: android oauth-2.0 google-api google-oauth

我正在编写一个需要访问Google的Calendar API的Android应用程序。我想避免使用Google API客户端库来支持简单的Retrofit REST实现。但是,我似乎无法获得正确的授权凭据才能完成Calendar API REST调用。在我的应用中,我使用以下选项成功登录:

    GoogleSignInOptions
        .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestScopes(Scope("https://www.googleapis.com/auth/calendar"))
        .requestEmail()
        .requestIdToken("WEB CLIENT ID HERE")
        .build()

最后我得到一个GoogleSignInAccount,使我可以访问idToken属性。我已经尝试在日历API请求的授权标头中将此idToken用作OAuth 2.0 Bearer令牌,但每次都被401拒绝。关于Google的OAuth流程,有很多文档似乎相互矛盾或已被更新,但这使事情非常混乱。为了能够从我的Android应用程序使用REST API,我需要做什么?

2 个答案:

答案 0 :(得分:0)

谢谢您的回答,我设法找到了如何使用GoogleSignInAccount来验证API请求。

使用google_sign_in插件成功登录帐户后 (请参见example以获得帮助),您可以直接从GoogleSignInAccount获取api请求的身份验证所需的身份验证标头。 参见:

GoogleSignInAccount _currentUser;
Future<Map<String, dynamic>> _getLabels() await {
  http.Response _response = await http.get(
    'https://www.googleapis.com/gmail/v1/users/'+_currentUser.id+'/labels',
    headers: await currentUser.authHeaders,
  );
  return jsonDecode(_response);
}

答案 1 :(得分:0)

authHeaders仅在Dart中实现,可以在https://pub.dev/documentation/google_sign_in/latest/google_sign_in/GoogleSignInAccount-class.html处检查源。

所以authHeaders如下:

"Authorization": "Bearer $accessToken",
    "X-Goog-AuthUser": "0",

现在如何获取accessToken? Dart正在呼叫GoogleSignInPlatform.instance.getTokens(email, shouldRecoverAuth: true);该方法的含义可以在这里找到:https://github.com/flutter/plugins/blob/master/packages/google_sign_in/google_sign_in_platform_interface/lib/src/method_channel_google_sign_in.dart#L50

Aaaaand我放弃了这个Google废话:

  1. 有一个神奇的章节 Obtain an access token from the Google Authorization Server.,其中对如何获取访问令牌一无所知。 Google大量产生了糟糕的闲聊无用文档的典型例子。
  2. 文档进一步将我发送到https://developers.google.com/identity/sign-in/android/,该文档仍未说明如何获取accessToken。
  3. 该文档门户将我发送到https://developers.google.com/identity/sign-in/android/start?authuser=2,该站点再次使用Web客户端而不是Android客户端,我无能为力。我的四肢停下来动弹,我的大脑融化,我的嘴巴张开,发出无尽无声的恐怖尖叫。这就是地狱的样子。阅读Google文档是地狱的样子。