当前位置: 首页 > news >正文

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; }
http://www.cnnetsun.cn/news/34721.html

相关文章:

  • 彻底解放游戏束缚:ER-Save-Editor让你成为真正的存档编辑大师
  • AI如何帮你快速搭建Tomcat8开发环境?
  • 终极指南:如何用Threema Android实现完全私密通讯
  • 交叉注意力在医疗影像诊断中的突破性应用
  • 39、保障Web服务器安全:从安装到配置的全流程指南
  • 5步构建去中心化能源交易平台:从概念验证到规模化部署
  • AI如何帮你优化SQL查询:INSERT SELECT实战技巧
  • 电商网站实战:解决商品列表页的无限循环问题
  • 5分钟搭建qiankun框架原型
  • Qwen3 30B A3B Python编程助手:企业级AI代码生成完全指南
  • 3步搞定LLM训练数据清洗:Easy Dataset智能优化指南
  • vue基于 Spring Boot 技术潞州区志愿者管理系统的设计与实现_22l8ehwh-java毕业设计
  • MCP Inspector完整指南:5步掌握MCP服务器可视化调试技巧
  • 如何快速掌握Visibility.js:页面可见性管理的完整指南
  • 终极Synology M2卷创建指南:5分钟快速部署NVMe存储池
  • AI视觉模型部署终极指南:从零到生产环境的完整实践
  • Legado开源阅读:打造个性化数字阅读的终极指南
  • CoffeeTime BIOS魔改工具:终极1151针主板升级指南
  • 5分钟原型开发:用Node.js快速验证产品创意
  • 终极指南:如何使用 circuit-tracer 深入探索深度学习模型内部电路
  • 如何用AI自动修复SW许可证错误-8.544.0
  • 5分钟搞定OceanBase监控告警:从零搭建完整运维体系
  • 如何用AI快速生成ztree树形菜单代码
  • OpenVSCode Server性能调优终极实战指南:从诊断到优化全链路深度解析
  • 终极FastAPI开发套件:一站式企业级解决方案
  • 敏捷开发中测试人员的价值定位
  • AI助力:用sprintf函数自动生成格式化字符串代码
  • 3、SSH技术:原理、应用与相关技术对比
  • Android热敏打印开发:让移动设备变身便携打印机
  • AI助力MinIO部署:自动化配置与优化指南