在服务器端进行验证时,来自google_sign_in插件的令牌无效

时间:2018-09-16 16:28:43

标签: dart flutter google-signin

请尝试使用插件google_sign_in plugin在Flutter应用中实施社交身份验证。它可以在客户端正常运行,并检索用户的帐户详细信息。
我的问题是我想将用户保存在数据库中,因此我需要验证在服务器端获取的id_token。我尝试使用服务器端的Google API库来执行此操作,如here所示,但是我键入了无效的令牌结果键。我最终决定尝试使用tokeninfo端点https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=<my_token>,该端点应该返回200响应,其中包含用户详细信息和其他信息的正文,但是我得到400响应,其中正文{"error_description": "Invalid Value"}
我使用jwt.io对令牌进行了解码,以确保它不是过期的令牌,并且该令牌仍然非常有效。

这是我在flutter上用来获取id_token的google_sign_in代码。

GoogleSignIn _googleSignIn = new GoogleSignIn(
    scopes: <String>[ 
      'profile',
      'email',
      'https://www.googleapis.com/auth/contacts.readonly',
    ],
  );

  Future<Null> _handleSignIn() async {
    try {
      _googleSignIn.signIn().then((result){
          result.authentication.then((googleKey){
              print(googleKey.accessToken);
              print(googleKey.idToken);
              print(_googleSignIn.currentUser.displayName);
          }).catchError((err){
            print('inner error');
          });
      }).catchError((err){
          print('error occured');
      });
      print('signed in .....');
    } catch (error) {
      print(error);
    }
  } 

请提供任何帮助。

2 个答案:

答案 0 :(得分:0)

在google_sign_in文档中,它们提供了有关IOS的详细信息,但在Android中,它们缺少了这些步骤:

  1. 添加
  

classpath'com.google.gms:google-services:4.2.0'

根目录“ build.gradle”中的依赖项

  1. 添加
  

应用插件:“ com.google.gms.google-services”

在底部显示“ app / build.gradle”

  1. 添加
  

实施“ com.google.gms:google-services:4.2.0”

在“ app / build.gradle”中的依赖项中

  1. 转到您的Firebase控制台,下载
  

google-services.json

并将其复制到目录“ app /”

完成所有这些步骤后,您可以运行并正常使用idToken

答案 1 :(得分:0)

事实证明令牌始终有效。令牌在命令行上被截断并变得无效。
我现在测试有效性的方法是使用HTTP包进行测试,而不必复制令牌。
例如。

 Dio dio = new Dio();
 Response response = await dio.get('https://www.googleapis.com/oauth2/v1/tokeninfo?id_token='+googleKey.idToken);
 print(response.data); //contains the token info