Flutter OAuth2授权插件x_oauth2_pkce的使用
Flutter OAuth2授权插件x_oauth2_pkce的使用
在Flutter应用中集成OAuth 2.0 PKCE的最优化和最简便方式 🐦
1. 指南 🌎 #
此库为在Flutter应用中通过OAuth 2.0 PKCE进行身份验证提供了最简便的方法。
支持项目,请给仓库点赞。
我们推荐将此库与封装了Twitter API v2.0的twitter_api_v2一起使用!
1.1. 开始使用 ⚡ #
1.1.1. 安装库 #
使用Dart:
dart pub add x_oauth2_pkce
或使用Flutter:
flutter pub add x_oauth2_pkce
1.1.2. 导入库 #
import 'package:x_oauth2_pkce/x_oauth2_pkce.dart';
1.1.3. 设置 #
首先,为了测试此库,请在您的Twitter开发者门户中设置回调URI为`org.example.android.oauth://callback/`。
1.1.3.1. Android
在Android上,必须首先在build.gradle文件中设置minSdkVersion:
defaultConfig {
...
minSdkVersion 18
...
}
还需要向AndroidManifest.xml
添加以下定义:
<activity android:name="com.linusu.flutter_web_auth_2.CallbackActivity" android:exported="true">
<intent-filter android:label="flutter_web_auth_2">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="org.example.android.oauth" android:host="callback" />
</intent-filter>
</activity>
详细信息可以查看此处。
1.1.3.2. iOS
在iOS上,需要在ios/Podfile文件中设置平台:
platform :ios, '11.0'
1.1.3.3. Web
目前,官方Twitter不支持CORS
,因此此包也不主动支持Flutter for Web
。然而,此包可以从Web应用中使用,并且确实具有用于Flutter for Web
的内置处理程序。
使用此包的实现方法与上述Android
和iOS
相同,但需要单独创建HTML以在认证后重定向到目的地。
详细说明可以在flutter_web_auth_2
包的README中找到。
1.1.4. 实现 #
现在剩下的就是启动以下示例Flutter应用并按下按钮开始使用OAuth 2.0 PKCE的授权流程!
在按下Authorize
按钮后,将执行重定向操作,您会看到已获得您的Bearer令牌和刷新令牌。
import 'package:flutter/material.dart';
import 'package:x_oauth2_pkce/x_oauth2_pkce.dart';
void main() {
runApp(const MaterialApp(home: Example()));
}
class Example extends StatefulWidget {
const Example({Key? key}) : super(key: key);
@override
State<Example> createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
String? _accessToken;
String? _refreshToken;
@override
Widget build(BuildContext context) => Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text('Access Token: $_accessToken'),
Text('Refresh Token: $_refreshToken'),
ElevatedButton(
onPressed: () async {
final oauth2 = TwitterOAuth2Client(
clientId: 'YOUR_CLIENT_ID',
clientSecret: 'YOUR_CLIENT_SECRET',
redirectUri: 'org.example.android.oauth://callback/',
customUriScheme: 'org.example.android.oauth',
);
final response = await oauth2.executeAuthCodeFlowWithPKCE(
scopes: Scope.values,
);
setState(() {
_accessToken = response.accessToken;
_refreshToken = response.refreshToken;
});
},
child: const Text('推送!'),
)
],
),
),
);
}
1.2. 从先前版本升级 (< 1.0.0) #
版本1.0.0
引入了一些需要解决的破坏性更改,如果您是从先前版本升级的。
请注意以下几点:
- 从版本1.0.0起,
flutter_web_auth
已被flutter_web_auth_2
取代。请参阅升级指南。 - 迁移到
flutter_web_auth_2
标志着过渡到Flutter 3
。这意味着您必须升级到Flutter 3
(一个简单的flutter upgrade
应该足够了)。
1.3. 贡献 🏆 #
如果您想为twitter-oauth2-pkce
贡献,请创建一个问题或提交一个拉取请求。
有很多方式可以为OSS做出贡献。例如,可以考虑以下主题:
- 有一些尚未实现的作用域。
- 文档过时或不完整。
- 有更好的方法或想法来实现功能。
- 等等...
您可以从以下资源中查看更多详情:
或者,如果您愿意,可以创建一个讨论。
欢迎加入开发,多元化的意见使软件更好!
1.4. 支持 ❤️ #
最简单的方式是通过在GitHub和Pub.dev给项目点赞来表示支持。
您也可以通过成为GitHub上的赞助者来支持此项目:
1.5. 许可证 🔑 #
x_oauth2_pkce
的所有资源均根据BSD-3
许可证提供。
注意
源代码中的许可证通知基于.github/header-checker-lint.yml
严格验证。请检查header-checker-lint.yml以了解允许的标准。
1.6. 更多信息 🧐 #
x_oauth2_pkce
由Kato Shinya ([@myConsciousness](/user/myConsciousness))设计和实现。
更多关于Flutter OAuth2授权插件x_oauth2_pkce的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter OAuth2授权插件x_oauth2_pkce的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
x_oauth2_pkce
是一个用于 Flutter 的 OAuth2 授权插件,支持 PKCE(Proof Key for Code Exchange)流程。PKCE 是一种增强 OAuth2 安全性的机制,特别适用于移动应用和单页应用(SPA),因为它不需要在客户端存储客户端密钥。
以下是使用 x_oauth2_pkce
插件的基本步骤:
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 x_oauth2_pkce
依赖:
dependencies:
flutter:
sdk: flutter
x_oauth2_pkce: ^0.0.1 # 请确保使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入包
在你的 Dart 文件中导入 x_oauth2_pkce
包:
import 'package:x_oauth2_pkce/x_oauth2_pkce.dart';
3. 配置 OAuth2 客户端
创建一个 OAuth2Client
实例,并配置你的 OAuth2 服务器的详细信息:
final oauth2Client = OAuth2Client(
authorizationEndpoint: 'https://your-auth-server.com/oauth2/auth',
tokenEndpoint: 'https://your-auth-server.com/oauth2/token',
redirectUri: 'com.example.app:/oauth2redirect',
clientId: 'your-client-id',
scopes: ['openid', 'profile', 'email'],
);
4. 启动授权流程
使用 oauth2Client
启动授权流程,并获取授权码:
final authCode = await oauth2Client.requestAuthorization();
5. 交换授权码获取访问令牌
使用获取到的授权码交换访问令牌:
final tokenResponse = await oauth2Client.requestToken(authCode);
final accessToken = tokenResponse.accessToken;
6. 使用访问令牌
现在你可以使用 accessToken
来访问受保护的资源:
final response = await http.get(
'https://your-api-server.com/protected-resource',
headers: {
'Authorization': 'Bearer $accessToken',
},
);
7. 处理刷新令牌(可选)
如果你的 OAuth2 服务器支持刷新令牌,你可以使用刷新令牌来获取新的访问令牌:
final newTokenResponse = await oauth2Client.refreshToken(tokenResponse.refreshToken);
final newAccessToken = newTokenResponse.accessToken;
8. 处理错误
确保在授权和令牌请求过程中处理可能的错误:
try {
final authCode = await oauth2Client.requestAuthorization();
final tokenResponse = await oauth2Client.requestToken(authCode);
final accessToken = tokenResponse.accessToken;
} on OAuth2Exception catch (e) {
print('OAuth2 Error: ${e.message}');
} catch (e) {
print('Unexpected Error: $e');
}
9. 清理
在使用完 OAuth2Client
后,确保进行适当的清理:
oauth2Client.dispose();