Flutter Google Sign_In

本文最后更新于:2025年1月2日 晚上

使用插件:google_sign_in

这个插件是基于firebase的,firebase是google旗下提供给移动应用和web平台使用的开放平台;

1. 注册firebase账号

google登录嘛,你得先有个google账号才能去注册firebase;
FireBase控制台

2. 创建项目和应用,在项目下创建android和ios应用

创建一个项目

在项目下新建android和ios应用

2.1 创建Android项目:

第一步写完之后其实就结束了,后面直接下一步下一步完成就行了(SHA-1签名肯定是要填的,不过现在不填,晚点填也可以)。第二步要你下载google-services.json文件放在项目中,如果只是用google登录这个插件,那么其实是不需要的,除非你用到了其他google服务。
(我在使用google message推送的时候是需要这个文件的,但是是根据配置它自动下载的,位置在android/app/google-services.json)

点击完成之后,设置Android项目:

上图所示页面需要添加指纹,就是SHA-1秘钥,debug和release的都需要填写,发布google play商店的时候,我用的是google play自带的签名,所有需要把这个签名也加进来;

值得注意的一点是,如果你没有自己生成z证书签名,androdi stduio会使用自己的默认debug签名证书,mac的文件位置:.android/debug.keystore;

生成证书参考:flutter android 打包自定义jks
获取签名SHA-1的方法:

1
keytool -list -v -keystore  <jks路径>

2.2 创建ios项目:

这里的第二步需要下载一个GoogleService-Info.plist文件,这个文件需要放在ios/Runner这个目录下,其他的就没什么了;

3. 配置OAuth屏幕的凭据和OAuth权限请求页面

OAuth屏幕

在左上角切换你刚才在firebase里面新建的项目,如果找不到,试试看看[全部]选项;

然后点击左侧菜单 OAuth权限请求页面,配置你的项目信息;

如果你一切顺利,这时候在凭据菜单内会有三个OAuth2.0 客户端ID,那么就没什么问题了;

在这里我遇到一个奇怪的错误,等会在下面再说;

4. 使用

1
2
3
4
5
6
7
8
9
import 'package:google_sign_in/google_sign_in.dart';

//google登录
final GoogleSignIn googleSignIn = GoogleSignIn(scopes: ['email']);

void googleLogin() async {
GoogleSignInAccount? googleResult = await googleSignIn.signIn();
print(googleResult);
}

使用时有个注意的地方,google账号会保持登录状态一段时间,如果我们想每次点击登录按钮都提示登录。那么就需要退出登录状态,达到切换账号的目的:

1
2
3
4
5
6
7
8
9
googleSignIn.isSignedIn().then((value) async{
print(value);
// 如果不退出,那已登录状态会保持一段时间,就不能达到切换账号的目的了
if(value == true){
await googleSignIn.signOut();
}
GoogleSignInAccount? googleResult = await googleSignIn.signIn();
print(googleResult);
});

5. 遇到的问题

很快啊,ios嗖的一下就好了;
android遇到了问题,报错信息如下:

1
2
3
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] 
Unhandled Exception: PlatformException(sign_in_failed,
com.google.android.gms.common.api.ApiException: 10: , null, null)

靠,这个问题高了好几个小时,按照stackoverflow的回答,我也一直以为这个是SHA-1签名的问题,我删除证书,重新新建,删除SHA-1,重新设置,但是问题依然存在,在此期间我升级了开发工具,清除android缓存,flutter缓存,添加了sha1和sha256两种秘钥,折腾死了也没好。

然后在github搜啊搜,看到这个问题:ISSUE #33393

Issue中提示填写好OAuth屏幕的所有必填信息,我填过了啊,其实这个Issue和我遇到的问题不太一样,但是据此我得出结论,问题就出在OAuth这一块的设置上。

图上的android是我自己手动加上去的,为什么ios和web是自动加上去的,android却没有呢,在我手动加上去之后,google 登录就好了,我草!!!

然后我把firebase项目里面android应用所有的SHA 证书指纹全部删除了,还是能登录,不应该啊,但是确实是可以,太奇怪了,哎!保险起见,我还是把debug和release签名的两个SHA-1加进去了,保险点吧,毕竟后面用其他第三方服务也是需要的。

后来我新建应用的时候,增加sha1, OAuth2.0客户端id是自动增加上去的,加几个SHA-1就会自动新增几个OAuth2.0客户端id,看来是这只是个偶然的bug,希望你们不会遇到;


Flutter Google Sign_In
http://bestkele.com/2023/09/20/flutter/flutter-googleSignIn/
作者
kele
发布于
2023年9月20日
许可协议