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

Flutter三方库适配OpenHarmony【flutter_web_auth】— OAuth2 协议基础与认证流程拆解

前言

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

要理解 flutter_web_auth 为什么这样设计,得先搞懂OAuth2 协议。很多开发者用 OAuth2 登录用了好几年,但对协议本身一知半解——知道要拿 code 换 token,但不清楚为什么要这么绕。这篇把 OAuth2 的授权码模式从头讲一遍,然后对应到 flutter_web_auth 的每个参数上。

一、为什么需要 OAuth2

1.1 没有 OAuth 的时代

用户 → 把用户名密码给第三方 App → App 直接登录用户的账号

问题很明显:

  • 第三方 App 拿到了用户的密码
  • 用户无法控制 App 的权限范围
  • 用户改密码后所有第三方 App 都失效

1.2 OAuth2 的解决方案

用户 → 在授权服务器上登录 → 授权服务器给 App 一个临时令牌 → App 用令牌访问资源

二、OAuth2 四种授权模式

2.1 模式概览

2.2 为什么授权码模式最安全

隐式模式:浏览器直接拿到 access_token → token 暴露在 URL 中 授权码模式:浏览器只拿到 code → code 在后端换 token → token 不经过浏览器

💡授权码模式多了一步"用 code 换 token",看起来多此一举,但这一步让 access_token 永远不会出现在浏览器的地址栏里,大大降低了泄露风险。

2.3 flutter_web_auth 的定位

flutter_web_auth 不限制你用哪种模式。它只负责"打开浏览器"和"接收回调 URL"。但实际使用中,授权码模式是最常见的。

三、授权码流程完整时序

3.1 时序图

┌──────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 用户 │ │ App │ │ 浏览器 │ │ 授权服务器 │ └──┬───┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ 点击登录 │ │ │ │ ──────────> │ │ │ │ │ 打开浏览器 │ │ │ │ ─────────────> │ │ │ │ │ 加载授权页面 │ │ │ │ ─────────────> │ │ 输入密码 │ │ │ │ ──────────────────────────> │ │ │ │ │ 授权成功 │ │ │ │ <───────────── │ │ │ │ 重定向到 │ │ │ │ scheme:// │ │ │ │ ?code=abc123 │ │ │ 深度链接回调 │ │ │ │ <───────────── │ │ │ │ │ │ │ 用 code 换 token │ │ │ ──────────────────────────────> │ │ │ 返回 access_token │ │ │ <────────────────────────────── │ │ 登录成功 │ │ │ <────────── │ │

3.2 每一步的参数

步骤参数示例
1. 构造授权 URLclient_id, redirect_uri, scope, statehttps://auth.example.com/authorize?client_id=xxx&redirect_uri=myapp://&scope=email&state=random
2. 打开浏览器urlflutter_web_auth 的url参数
3. 用户授权用户名, 密码在浏览器中完成
4. 重定向回调code, statemyapp://callback?code=abc123&state=random
5. 换取 tokencode, client_secretPOST 请求到 token endpoint

3.3 flutter_web_auth 参与的步骤

// 步骤 1:构造授权 URL(开发者自己做)finalurl=Uri.https('accounts.google.com','/o/oauth2/v2/auth',{'response_type':'code','client_id':googleClientId,'redirect_uri':'$callbackUrlScheme:/','scope':'email',});// 步骤 2-4:flutter_web_auth 负责finalresult=awaitFlutterWebAuth.authenticate(url:url.toString(),callbackUrlScheme:callbackUrlScheme,);// 步骤 4:解析回调 URL(开发者自己做)finalcode=Uri.parse(result).queryParameters['code'];// 步骤 5:换取 token(开发者自己做)finalresponse=awaithttp.post(tokenEndpoint,body:{'grant_type':'authorization_code','code':code,'client_id':clientId,'client_secret':clientSecret,});

四、callbackUrlScheme 的作用

4.1 什么是 URL Scheme

myapp://callback?code=abc123 │ │ │ Scheme Host Query Parameters

URL Scheme 是 URL 的第一部分,用于标识协议类型。常见的有httphttpsftp。自定义 Scheme 如myapp可以用来唤起特定的 App。

4.2 RFC 3986 规范

staticRegExp_schemeRegExp=newRegExp(r"^[a-z][a-z0-9+.-]*$");

合法的 Scheme 必须:

  1. 以小写字母开头
  2. 后续只能包含小写字母、数字、+.-
Scheme合法原因
myapp纯小写字母
com.example.app包含点号
my-app包含连字符
MyApp包含大写字母
my_app包含下划线
1app以数字开头

📌这是最常见的坑之一。很多开发者用了下划线或大写字母,导致回调永远收不到。flutter_web_auth 在 Dart 层做了正则校验,不合法的 Scheme 会直接抛出ArgumentError

4.3 在各平台的配置

平台配置位置配置方式
AndroidAndroidManifest.xml<data android:scheme="myapp" />
iOSInfo.plistURL Types → URL Schemes
OpenHarmonymodule.json5skills → uris → scheme
Web不需要通过 postMessage 传递

五、Access Token / Refresh Token / Authorization Code

5.1 三者的关系

Authorization Code → 换取 → Access Token + Refresh Token │ │ ↓ ↓ 访问资源(短期) 刷新 Token(长期)

5.2 生命周期对比

凭证有效期用途安全要求
Authorization Code几分钟一次性换 token
Access Token几小时访问 API
Refresh Token几天到几个月刷新 access token极高

5.3 flutter_web_auth 只涉及 Authorization Code

// flutter_web_auth 返回的是包含 code 的 URLfinalresult=awaitFlutterWebAuth.authenticate(...);// result = "myapp://callback?code=abc123"// 后续的 token 交换不是 flutter_web_auth 的职责finalcode=Uri.parse(result).queryParameters['code'];

六、隐式模式与授权码模式的对比

6.1 隐式模式

// 隐式模式:浏览器直接返回 tokenfinalurl=Uri.https('auth.example.com','/authorize',{'response_type':'token',// 注意:是 token 不是 code'client_id':clientId,'redirect_uri':'$callbackUrlScheme:/',});finalresult=awaitFlutterWebAuth.authenticate(url:url.toString(),callbackUrlScheme:callbackUrlScheme,);// 直接从 URL fragment 中获取 tokenfinaltoken=Uri.parse(result).fragment.split('&').firstWhere((e)=>e.startsWith('access_token=')).split('=')[1];

6.2 两种模式的安全性对比

维度授权码模式隐式模式
Token 暴露在 URL 中❌ 不会✅ 会
需要 client_secret✅ 是❌ 否
支持 Refresh Token✅ 是❌ 否
适合移动端✅ 推荐⚠️ 不推荐

💡OAuth 2.1 草案已经废弃了隐式模式。移动端应该始终使用授权码模式 + PKCE。

七、flutter_web_auth 的职责边界

7.1 职责清单

flutter_web_auth 做的事:

  1. 校验 callbackUrlScheme 的合法性
  2. 通过 MethodChannel 调用原生端
  3. 原生端打开系统浏览器
  4. 监听深度链接回调
  5. 把回调 URL 返回给 Dart
  6. 处理用户取消(dangling calls 清理)

flutter_web_auth 不做的事:

  • 构造 OAuth2 授权 URL
  • 管理 client_id / client_secret
  • 用 code 换取 token
  • 存储和刷新 token
  • 实现登录 UI
  • 管理用户会话

7.2 与其他包的配合

// flutter_web_auth:打开浏览器 + 接收回调finalresult=awaitFlutterWebAuth.authenticate(...);// http:发送 HTTP 请求换 tokenfinalresponse=awaithttp.post(tokenEndpoint,body:{...});// flutter_secure_storage:安全存储 tokenawaitstorage.write(key:'access_token',value:token);// dio:带 token 访问 APIdio.options.headers['Authorization']='Bearer$token';

7.3 为什么不做更多

设计选择原因
不构造 URL每个 OAuth 提供商的参数不同
不换 token需要 client_secret,不应在客户端
不存 token存储策略因项目而异
不管 UI认证页面由服务商提供

📌单一职责原则。flutter_web_auth 只做"浏览器认证桥梁"这一件事,做好这一件事。其他的交给专门的包。

总结

本文讲解了 OAuth2 协议基础和 flutter_web_auth 的定位:

  1. OAuth2 授权码模式:最安全的授权方式,code 不直接暴露 token
  2. callbackUrlScheme:必须符合 RFC 3986,小写字母开头,不能有下划线
  3. flutter_web_auth 的职责:只负责"打开浏览器"和"接收回调"两步
  4. 与其他包配合:http 换 token、flutter_secure_storage 存 token

下一篇我们逐行解析 Dart 层源码——55 行代码里藏了不少精妙的设计。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

  • OAuth 2.0 RFC 6749
  • OAuth 2.1 草案
  • RFC 3986 URI 规范
  • PKCE RFC 7636
  • flutter_web_auth GitHub
  • Google OAuth2 文档
  • GitHub OAuth 文档
  • 开源鸿蒙跨平台社区
http://www.jsqmd.com/news/403963/

相关文章:

  • 如何实现电商数据的智能化整合与分析
  • AI应用架构师为什么说:法律研究数据挖掘的关键是“场景化AI分析”?
  • 2026年加速器厂家权威推荐榜:短效IP/静态IP/SDK包/http/socks5/代理IP/动态IP/宽带多拨/选择指南 - 优质品牌商家
  • 提示工程架构性能优化:高效策略大汇总
  • Doris与Tableau集成:企业级大数据BI解决方案
  • Java SpringBoot+Vue3+MyBatis 校园社团信息管理pf系统源码|前后端分离+MySQL数据库
  • 别再做“为AI而AI”的场景!架构师必须掌握的“业务价值优先”设计原则
  • Java SpringBoot+Vue3+MyBatis web网上摄影工作室开发与实现pf系统源码|前后端分离+MySQL数据库
  • 2026年静态IP公司权威推荐:socks5/代理IP/动态IP/宽带多拨/模拟器/短效IP/S5代理/SDK包/选择指南 - 优质品牌商家
  • 2026年花生种子优质厂家选购指南与深度解析 - 2026年企业推荐榜
  • 2026年短效IP厂家权威推荐榜:http、socks5、代理IP、加速器、宽带多拨、模拟器、静态IP、S5代理选择指南 - 优质品牌商家
  • 【2025最新】基于SpringBoot+Vue的宠物领养系统管理系统源码+MyBatis+MySQL
  • 2026年评价高的动态IP公司推荐:模拟器、短效IP、S5代理、SDK包、http、socks5、代理IP、加速器选择指南 - 优质品牌商家
  • 2026年360摇滚乐吧车厂家最新推荐:逍遥乐吧车/公园碰碰车/商场碰碰车/地网碰碰车/夜市摆摊碰碰车/广场乐吧车/选择指南 - 优质品牌商家
  • 2026年逍遥乐吧车厂家最新推荐:商场碰碰车、地网碰碰车、夜市摆摊碰碰车、广场乐吧车、广场电瓶碰碰车、户外网红碰碰车选择指南 - 优质品牌商家
  • 输了游戏却赢了Respect 黄晓明在东北雪原上用“脚动档”滑出了最稳的安全感
  • 2026年评价高的广场电瓶碰碰车公司推荐:夜市摆摊碰碰车、广场乐吧车、户外网红碰碰车、旋转乐吧车、游乐场碰碰车选择指南 - 优质品牌商家
  • 2026年户外网红碰碰车厂家权威推荐榜:地网碰碰车、夜市摆摊碰碰车、室内遥控碰碰车、广场乐吧车、旋转乐吧车、游乐场碰碰车选择指南 - 优质品牌商家
  • 二分图和网络流
  • 2026年自动洗瓶机厂家推荐:毛刷式洗瓶机、玻璃瓶洗瓶机、自动化清洗瓶机、啤酒瓶洗瓶机、饮料瓶洗瓶机、回收瓶洗瓶机选择指南 - 优质品牌商家
  • 2026年一体化废水处理设备公司权威推荐:气浮机一体化污水处理设备/污水处理设备一体化处理设备/福建污水处理设备公司/选择指南 - 优质品牌商家
  • 2026看看解析高性能第一如何用FastAPI构建高性能的现代API
  • 2026年实验室洗瓶机厂家权威推荐榜:啤酒瓶洗瓶机、毛刷式洗瓶机、玻璃瓶洗瓶机、组培瓶洗瓶机、自动化清洗瓶机、饮料瓶洗瓶机选择指南 - 优质品牌商家
  • 2026年一体化污水处理成套设备厂家推荐:mbr一体化污水处理设备、mvr厂家、中水处理设备、低温蒸发器、医疗废水处理一体化设备选择指南 - 优质品牌商家
  • 2026玩家普及第一如何用FastAPI构建高性能的现代API
  • 2026科普普及第一如何用FastAPI构建高性能的现代API
  • 2027高性能科普第一如何用FastAPI构建高性能的现代API
  • 第 12 章:Linux 侧 RPMsg 用户态驱动与数据接口
  • 唐山市跳汰机选型指南:2026年头部厂家综合评测榜单 - 2026年企业推荐榜
  • 第 11 章:HSEM 硬件信号量与无锁队列——解决优先级反转