news 2026/6/10 11:55:40

Flutter 开发的鸿蒙AtomGit OAuth 授权应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter 开发的鸿蒙AtomGit OAuth 授权应用

Flutter 开发的鸿蒙AtomGit OAuth 授权应用

项目概述

这是一个基于 Flutter 开发的鸿蒙OAuth 2.0 授权应用,用于获取 AtomGit 授权用户的个人信息。应用实现了完整的 OAuth 授权流程,包括:

  • ✅ OAuth 2.0 授权码模式
  • ✅ 访问令牌获取和刷新
  • ✅ 用户信息获取和展示
  • ✅ 令牌本地存储和管理
  • ✅ 自动令牌刷新机制

功能特性

1. OAuth 授权流程

  • 使用 WebView 进行 OAuth 授权
  • 自动捕获授权回调
  • 获取访问令牌和刷新令牌

2. 用户信息展示

  • 用户基本信息(头像、姓名、用户名等)
  • 统计信息(关注者、关注中)
  • 常用编程语言
  • 个人主页链接

3. 令牌管理

  • 本地存储访问令牌和刷新令牌
  • 自动检测令牌过期
  • 自动刷新过期令牌
  • 退出登录功能

配置步骤

步骤 1:创建 OAuth 应用

  1. 登录 AtomGit

  2. 进入设置应用开发者设置

  3. 点击新建应用

  4. 填写应用信息:

    • 应用名称:你的应用名称
    • 应用描述:应用描述
    • 应用主页:你的应用主页 URL
    • 回调地址:你的重定向 URI(例如:myapp://oauth/callback
    • 权限范围:选择需要的权限(例如:read:user,user:email
  5. 创建完成后,记录以下信息:

    • Client ID
    • Client Secret

步骤 2:配置应用

打开lib/services/oauth_service.dart文件,修改以下配置:

// 这些值需要从你的 OAuth 应用配置中获取staticconstString clientId='YOUR_CLIENT_ID';// 替换为你的 Client IDstaticconstString clientSecret='YOUR_CLIENT_SECRET';// 替换为你的 Client SecretstaticconstString redirectUri='YOUR_REDIRECT_URI';// 替换为你的重定向 URI

示例:

staticconstString clientId='abc123def456';staticconstString clientSecret='secret_key_here';staticconstString redirectUri='myapp://oauth/callback';

步骤 3:配置重定向 URI(Android)

如果使用 Android 平台,需要在android/app/src/main/AndroidManifest.xml中添加 Intent Filter:

<activityandroid:name=".MainActivity"android:exported="true"android:launchMode="singleTop"android:theme="@style/LaunchTheme"><!-- 其他配置 --><!-- 添加 OAuth 回调 Intent Filter --><intent-filter><actionandroid:name="android.intent.action.VIEW"/><categoryandroid:name="android.intent.category.DEFAULT"/><categoryandroid:name="android.intent.category.BROWSABLE"/><dataandroid:scheme="myapp"android:host="oauth"android:pathPrefix="/callback"/></intent-filter></activity>

注意android:schemeandroid:host需要与你的redirectUri匹配。

步骤 4:配置重定向 URI(iOS)

如果使用 iOS 平台,需要在ios/Runner/Info.plist中添加 URL Scheme:

<key>CFBundleURLTypes</key><array><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>myapp</string></array></dict></array>

项目结构

lib/ ├── main.dart # 应用入口,授权检查页面 ├── services/ │ ├── oauth_service.dart # OAuth API 服务 │ └── storage_service.dart # 本地存储服务 └── pages/ ├── oauth_page.dart # OAuth 授权页面 └── user_info_page.dart # 用户信息展示页面

核心功能说明

1. OAuth 授权流程

// 获取授权 URLString authUrl=OAuthService.getAuthorizationUrl();// 在 WebView 中打开授权页面// 用户授权后,会重定向到 redirectUri,并携带授权码// 使用授权码获取访问令牌OAuthToken token=awaitOAuthService.getAccessToken(code);

2. 获取用户信息

// 使用访问令牌获取用户信息UserInfo userInfo=awaitOAuthService.getUserInfo(accessToken);

3. 刷新令牌

// 当访问令牌过期时,使用刷新令牌获取新的访问令牌OAuthToken newToken=awaitOAuthService.refreshAccessToken(refreshToken);

4. 本地存储

// 保存访问令牌awaitStorageService.saveAccessToken(token);// 获取访问令牌String?token=awaitStorageService.getAccessToken();// 检查令牌是否过期bool isExpired=awaitStorageService.isTokenExpired();// 清除所有令牌awaitStorageService.clearTokens();

API 接口说明

1. 获取访问令牌

接口:POST https://gitcode.com/oauth/token

请求参数:

  • grant_type:authorization_code(获取新 token)或refresh_token(刷新 token)
  • code: 授权码(获取新 token 时必填)
  • client_id: 客户端 ID(获取新 token 时必填)
  • client_secret: 客户端密钥(获取新 token 时在 Body 中传递)
  • refresh_token: 刷新令牌(刷新 token 时必填)

响应示例:

{"access_token":"your_access_token","expires_in":7200,"refresh_token":"your_refresh_token","scope":"read:user","created_at":"2024-01-01T00:00:00Z"}

2. 获取用户信息

接口:GET https://api.gitcode.com/api/v5/user

请求参数:

  • access_token: 访问令牌(Query 参数)

响应示例:

{"id":"123456","login":"username","name":"User Name","email":"user@example.com","avatar_url":"https://gitcode.com/avatars/123456","bio":"User bio","blog":"https://blog.example.com","company":"Company Name","html_url":"https://gitcode.com/username","followers":100,"following":50,"top_languages":["Dart","JavaScript","Python"]}

使用流程

  1. 启动应用

    • 应用会自动检查是否有有效的访问令牌
    • 如果有,直接跳转到用户信息页面
    • 如果没有,跳转到 OAuth 授权页面
  2. OAuth 授权

    • 在 WebView 中打开 GitCode 授权页面
    • 用户登录并授权
    • 授权成功后,应用自动获取访问令牌
  3. 查看用户信息

    • 自动获取并展示用户信息
    • 支持下拉刷新
    • 支持退出登录
  4. 令牌管理

    • 应用会自动检测令牌是否过期
    • 如果过期,会自动尝试刷新令牌
    • 如果刷新失败,会提示重新授权

注意事项

1. 安全性

  • ⚠️不要将 Client Secret 提交到代码仓库
  • ⚠️ 建议使用环境变量或配置文件管理敏感信息
  • ⚠️ 在生产环境中,考虑将 Client Secret 存储在服务器端

2. 重定向 URI

  • 重定向 URI 必须与 OAuth 应用中配置的完全一致
  • 支持自定义 URL Scheme(如:myapp://oauth/callback
  • 也支持 HTTP/HTTPS URL(需要配置相应的域名)

3. 令牌管理

  • 访问令牌通常有有效期(如:7200 秒)
  • 刷新令牌的有效期通常更长
  • 建议在令牌过期前主动刷新

4. 错误处理

  • 网络错误:检查网络连接
  • 授权失败:检查 Client ID 和 Client Secret
  • 令牌过期:应用会自动尝试刷新,失败后提示重新授权

常见问题

Q1: 授权后无法获取令牌?

A:检查以下几点:

  • Client ID 和 Client Secret 是否正确
  • 重定向 URI 是否与 OAuth 应用配置一致
  • 授权码是否有效(授权码只能使用一次)

Q2: 无法获取用户信息?

A:检查以下几点:

  • 访问令牌是否有效
  • 访问令牌是否过期
  • 是否有相应的权限范围(scope)

Q3: WebView 无法打开授权页面?

A:检查以下几点:

  • 网络连接是否正常
  • 授权 URL 是否正确
  • 是否需要在 AndroidManifest.xml 中添加网络权限

Q4: 令牌刷新失败?

A:检查以下几点:

  • 刷新令牌是否有效
  • 刷新令牌是否过期
  • 如果刷新失败,需要重新授权

扩展功能

1. 添加更多用户信息

可以在UserInfo模型中添加更多字段,并在getUserInfo方法中解析。

2. 添加其他 API 调用

参考OAuthService的实现,可以添加其他 GitCode API 的调用方法。

3. 改进 UI

可以根据需要自定义用户信息页面的 UI 设计。

4. 添加错误重试机制

可以实现更完善的错误处理和重试逻辑。

技术栈

  • Flutter: 跨平台 UI 框架
  • http: HTTP 请求库
  • webview_flutter: WebView 组件
  • shared_preferences: 本地存储
  • url_launcher: URL 启动器(可选)

参考资料

  • AtomGit API 文档
  • OAuth 2.0 规范
  • Flutter 官方文档
  • 开源鸿蒙跨平台开发者社区

注意:这是一个示例应用,用于演示 OAuth 2.0 授权流程。在生产环境中使用时,请确保遵循安全最佳实践。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:07:55

告别35岁危机!大模型应用开发实战课,助你拿下70万+高薪offer,非常详细收藏我这一篇就够了

传统程序员面临降薪裁员压力&#xff0c;而大模型应用开发工程师却供不应求&#xff0c;薪资高达70-154万。企业急需掌握RAG、Agent智能体和微调三大核心技术的AI人才。本文推荐《大模型应用开发实战训练》课程&#xff0c;通过理论实战项目帮助学员系统掌握大模型技术&#xf…

作者头像 李华
网站建设 2026/6/10 14:52:38

10余处武汉百年里份,28天上亿个高斯斑点,3D高斯技术1:1还原老武汉的城市记忆

手持一台灵视P1 3D空间相机在窄巷中缓步穿行砖墙斑驳、木窗雕花、门楣字迹甚至墙角青苔都能被精准转化为永久保存的数字记忆在武汉这座历史与现代交织的城市里&#xff0c;有一种独特的民居建筑——里份。它们诞生于汉口开埠后的风云岁月&#xff0c;是中西建筑文化交融的珍贵标…

作者头像 李华
网站建设 2026/6/9 19:46:30

47、深入了解Shell选项与环境变量配置

深入了解Shell选项与环境变量配置 在使用Shell时,我们常常需要根据不同的需求来调整其行为。这可以通过设置选项、使用 shopt 命令以及配置环境变量来实现。下面将详细介绍相关的选项和变量。 1. 基本选项及其含义 首先,我们来看看一些基本的选项及其对应的含义,这些选项…

作者头像 李华
网站建设 2026/6/10 11:32:13

如何给整个文件夹/项目配置conda环境

1、进入设置 2、找到当前文件夹菜单&#xff0c;通常是Project&#xff1a;文件夹名 3、选择Python Interpreter&#xff0c;点击添加解释器 4、选择本地解释器 Add Local Interpreter&#xff0c;按以下步骤选择已经建立好的conda环境 不知道怎么建立conda环境的&#xff0c;看…

作者头像 李华
网站建设 2026/6/10 14:01:39

大模型智能体架构:单智能体vs多智能体选择与实战指南

随着大模型性能提升边际效益递减&#xff0c;智能体应用成为新焦点。文章系统探讨了从单智能体到多智能体的架构演进&#xff0c;分析了中心化与去中心化多智能体架构选择&#xff0c;详细介绍了专家Agent设计思路&#xff08;通才vs专才&#xff09;和跨Agent路由机制。通过实…

作者头像 李华
网站建设 2026/6/9 19:59:18

类和对象(三)-默认成员函数详解与运算符重载

hello&#xff0c;这里是AuroraWanderll。 兴趣方向&#xff1a;C&#xff0c;算法&#xff0c;Linux系统&#xff0c;游戏客户端开发 欢迎关注&#xff0c;我将更新更多相关内容&#xff01;我的个人主页 这是类和对象系列的第三篇文章&#xff0c;上篇指引&#xff1a; 类和对…

作者头像 李华