news 2026/4/16 9:17:31

Flutter 基于Firebase的鉴权功能集成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter 基于Firebase的鉴权功能集成

Firebase提供了一套SDK用于抹平不用平台鉴权的差异性,为了方便使用,将基于firebase_auth、google_sign_in、sign_in_with_apple的依赖封装一套登录统一的功能集成。

鉴权后将会获取idToken,该数据需要传给服务器进行校验。

步骤:

1.定义模块最终返回的数据结构

class FirebaseAuthInfo { String? idToken; String? providerId; FirebaseAuthInfo({this.idToken, this.providerId}); Map toJson() { return {"idToken": idToken, "providerId": providerId}; } }

2. 定义工具类,提供login和logout方法

enum LoginType { google, apple, phone, email } class LoginMethod { late LoginType loginType; factory LoginMethod(LoginType loginType) => LoginMethod._(loginType); LoginMethod._(this.loginType) { switch (loginType) { case LoginType.google: break; case LoginType.apple: break; case LoginType.phone: break; case LoginType.email: break; } } Future login() async { switch (loginType) { case LoginType.google: return await _googleSign(); case LoginType.apple: return await _appleSign(); case LoginType.phone: return; case LoginType.email: return; } } void logout() { switch (loginType) { case LoginType.google: _googleOut(); break; case LoginType.apple: break; case LoginType.phone: break; case LoginType.email: break; } } }

3. 基于Firebase Email的鉴权方法(该方法调用时,Android和IOS需要配置对应SchemeUrl,通过Applink才能实现)

Future<FirebaseAuthInfo?> verifyEmail(String email, Uri uri) async { if (FirebaseAuth.instance.isSignInWithEmailLink(uri.toString())) { try { final firebaseAuth = await FirebaseAuth.instance .signInWithEmailLink(email: email, emailLink: uri.toString()); var idToken = await firebaseAuth.user?.getIdToken(); return Future.value(FirebaseAuthInfo( idToken: idToken, providerId: firebaseAuth.credential?.providerId)); } catch (error) { print('Error signing in with email link.'); } return null; } else { return null; } }

4. 基于Firebase Phone的鉴权方法(验证码条数需要Firebase console中配置)

Future<FirebaseAuthInfo?> phoneSign(String code, String phone) async { Completer<FirebaseAuthInfo?> completer = Completer(); await FirebaseAuth.instance.verifyPhoneNumber( phoneNumber: '$code $phone', verificationCompleted: (PhoneAuthCredential credential) async { final firebaseAuth = await FirebaseAuth.instance.signInWithCredential(credential); var idToken = await firebaseAuth.user?.getIdToken(); if (!completer.isCompleted) { completer.complete(FirebaseAuthInfo( idToken: idToken, providerId: firebaseAuth.credential?.providerId)); } }, verificationFailed: (FirebaseAuthException e) { if (!completer.isCompleted) { completer.complete(null); } }, codeSent: (String verificationId, int? resendToken) {}, codeAutoRetrievalTimeout: (String verificationId) { if (!completer.isCompleted) { completer.complete(null); } }, ); return completer.future; }

5. 基于Google Account的鉴权方法(获取账户信息的作用域请查询官方文档),如需要每次登录都可以选择指定的google账号的动作,需要登录前先登出,否则本地有缓存,下次调用将直接复用上一次的账号信息。

void _googleOut() { try { var googleSignIn = GoogleSignIn( scopes: <String>[ 'https://www.googleapis.com/auth/userinfo.email', "https://www.googleapis.com/auth/userinfo.profile" ], ); googleSignIn.signOut(); } catch (e) {} } Future<FirebaseAuthInfo?> _googleSign() async { try { var googleSignIn = GoogleSignIn( scopes: <String>[ 'https://www.googleapis.com/auth/userinfo.email', "https://www.googleapis.com/auth/userinfo.profile" ], ); await googleSignIn.signOut(); var googleAccountInfo = await googleSignIn.signIn(); var googleAuth = await googleAccountInfo?.authentication; if (googleAuth != null) { var firebaseAuth = await FirebaseAuth.instance .signInWithCredential(GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, )); var idToken = await firebaseAuth.user?.getIdToken(); return FirebaseAuthInfo( idToken: idToken, providerId: firebaseAuth.credential?.providerId); } else { return Future.value(); } } catch (e) { debugPrint("Auth error !:${e.toString()}"); } return null; } }

6. 基于Apple Account的鉴权方法

Future<FirebaseAuthInfo?> _appleSign() async { try { final appleIdCredential = await SignInWithApple.getAppleIDCredential( scopes: [ AppleIDAuthorizationScopes.email, ], ); final oAuthProvider = OAuthProvider('apple.com'); final credential = oAuthProvider.credential( idToken: appleIdCredential.identityToken, accessToken: appleIdCredential.authorizationCode, ); var identify = await FirebaseAuth.instance.signInWithCredential(credential); var idToken = await identify.user?.getIdToken(); return FirebaseAuthInfo(idToken: idToken, providerId: "apple.com"); } catch (e) { debugPrint("Auth error !:${e.toString()}"); } return null; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 16:03:29

21、深入理解与操作SELinux策略

深入理解与操作SELinux策略 1. 利用sepolicy generate创建应用策略 对于应用程序而言, sepolicy generate 命令需要将主命令作为参数传入,以此生成一个简单的文件上下文( .fc )文件。此外, sepolicy generate 还支持以下与应用相关的模板: - --application :…

作者头像 李华
网站建设 2026/4/12 2:39:43

22、SELinux策略分析方法详解

SELinux策略分析方法详解 1. 初步角色分析 在SELinux策略分析中,可使用 sesearch 工具进行初步的角色分析。 - --role_allow 选项:用于显示允许的角色。例如,执行以下命令: $ sesearch --role_allow -s webadm_r allow webadm_r system_r;此命令显示 webadm_r 角…

作者头像 李华
网站建设 2026/4/16 7:45:03

Yaak桌面API客户端终极命令行指南:从入门到精通

Yaak桌面API客户端终极命令行指南&#xff1a;从入门到精通 【免费下载链接】yaak The most intuitive desktop API client. Organize and execute REST, GraphQL, WebSockets, Server Sent Events, and gRPC &#x1f9ac; 项目地址: https://gitcode.com/GitHub_Trending/y…

作者头像 李华
网站建设 2026/4/16 8:01:28

跨境电商实战:TikTok爆款选品到独立站运营全流程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个跨境电商数据分析面板&#xff0c;功能包括&#xff1a;1.多平台&#xff08;亚马逊/Shopify/TikTok&#xff09;销售数据聚合2.自动生成商品热度趋势图3.利润计算器&#…

作者头像 李华
网站建设 2026/4/15 23:02:42

零基础CSS下划线教程:从入门到创意

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个交互式学习模块&#xff0c;分步教学&#xff1a;1) 基础text-decoration使用 2) border模拟下划线 3) 伪元素实现自定义下划线 4) 简单动画效果。每个步骤提供代码沙盒、可…

作者头像 李华
网站建设 2026/4/15 18:59:11

VBA开发效率工具终极指南:Rubberduck完整教程

VBA开发效率工具终极指南&#xff1a;Rubberduck完整教程 【免费下载链接】Rubberduck Every programmer needs a rubberduck. COM add-in for the VBA & VB6 IDE (VBE). 项目地址: https://gitcode.com/gh_mirrors/ru/Rubberduck 还在为VBA代码调试而烦恼&#xff…

作者头像 李华