Flutter OAuth认证插件oauth_flutter的使用
Flutter OAuth认证插件oauth_flutter的使用
功能特性
oauth_flutter
是一个为Flutter应用提供的完整OAuth2解决方案,它处理认证、令牌存储和令牌刷新。以下是它的主要功能:
- 处理
dio
客户端设置:自动配置dio
客户端以进行API请求。 - 安全存储令牌:使用
flutter_secure_storage
安全地存储访问令牌和刷新令牌。 - 自动刷新过期令牌:当访问令牌过期时,自动刷新令牌。
- 刷新令牌过期处理:提供处理刷新令牌过期的机制。
- Nonce, PKCE 和状态验证:确保认证过程的安全性。
- OIDC 支持:
- 端点发现:自动发现OpenID Connect (OIDC) 端点。
- 访问 ID 令牌和原始 Nonce:获取ID令牌和原始Nonce。
- 支持 Firebase OIDC 隐式流:与Firebase OIDC集成。
开始使用
iOS 设置
在iOS上,你需要设置 Universal Links。这允许应用程序通过自定义URL方案接收回调。
Android 设置
在Android上,你需要设置 App Links。此外,为了捕获回调URL,需要在 AndroidManifest.xml
中添加以下活动,并将 YOUR_CALLBACK_URL_SCHEME_HERE
替换为实际的回调URL方案:
<manifest>
<application>
<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="YOUR_CALLBACK_URL_SCHEME_HERE" />
</intent-filter>
</activity>
</application>
</manifest>
Web 设置
在Web上,确保你的服务器使用 Strict-Transport-Security
头部来强制HTTPS。例如:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
此外,创建一个HTML文件(例如 oauth2/callback.html
),用于捕获回调URL并通过 postMessage
方法将其发送回应用程序:
<!DOCTYPE html>
<title>Authentication complete</title>
<p>
Authentication is complete. If this does not happen automatically, please
close the window.
</p>
<script>
function postAuthenticationMessage() {
const message = {
"flutter-web-auth-2": window.location.href,
};
if (window.opener) {
window.opener.postMessage(message, window.location.origin);
window.close();
} else if (window.parent && window.parent !== window) {
window.parent.postMessage(message, window.location.origin);
} else {
localStorage.setItem("flutter-web-auth-2", window.location.href);
window.close();
}
}
postAuthenticationMessage();
</script>
使用示例
以下是一个完整的示例代码,展示了如何使用 oauth_flutter
进行OAuth2认证并调用Fitbit API:
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:oauth_flutter/oauth_flutter.dart';
void main() async {
// 创建 OAuth2Client 实例
final client = OAuth2Client(
key: 'fitbit', // 你可以根据需要更改key
// `baseUrl` 是OAuth的 `aud` 参数
dio: Dio(BaseOptions(baseUrl: 'https://api.fitbit.com/1/user')),
endpoints: OAuth2Endpoints(
authorization: 'https://fitbit.com/oauth2/authorize',
token: 'https://api.fitbit.com/oauth2/token',
revocation: 'https://api.fitbit.com/oauth2/revoke',
),
// 如果服务具有统一的基础URL,可以使用 `OAuth2Endpoints.base`
// endpoints: OAuth2Endpoints.base('https://api.fitbit.com/oauth2'),
redirectUri: Uri.parse('https://your-app.com/oauth2/callback'), // 替换为你的回调URL
// 如果服务器注入了客户端凭证,则不需要传递
credentials: const OAuth2ClientCredentials(
id: 'your-client-id', // 替换为你的客户端ID
secret: 'your-client-secret', // 替换为你的客户端密钥
),
scope: { // 请求的权限范围
'activity',
'heartrate',
'nutrition',
'oxygen_saturation',
'respiratory_rate',
'settings',
'sleep',
'temperature',
'weight',
},
);
// 执行认证流程
final token = await client.authenticate();
debugPrint(token.idToken); // Fitbit 不支持 OIDC,因此这里可能为空
// 使用认证后的客户端进行API请求
final response = await client.dio.get('/GGNJL9/activities/heart/date/today/1d.json');
debugPrint(response.data);
// 检查是否已认证
final isAuthenticated = await client.isAuthenticated();
debugPrint(isAuthenticated.toString());
}
更多关于Flutter OAuth认证插件oauth_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter OAuth认证插件oauth_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter应用中使用oauth_flutter
插件来实现OAuth认证的代码示例。假设我们要实现一个使用GitHub OAuth认证的流程。
首先,确保你的Flutter项目已经设置好,并且已经添加了oauth_flutter
依赖。你可以在pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
oauth_flutter: ^0.1.7 # 请注意版本号,使用最新的稳定版本
然后运行flutter pub get
来安装依赖。
接下来,我们编写代码来实现OAuth认证。以下是一个简化的示例:
import 'package:flutter/material.dart';
import 'package:oauth_flutter/oauth_flutter.dart';
import 'dart:convert';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter OAuth Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: OAuthDemoPage(),
);
}
}
class OAuthDemoPage extends StatefulWidget {
@override
_OAuthDemoPageState createState() => _OAuthDemoPageState();
}
class _OAuthDemoPageState extends State<OAuthDemoPage> {
String? accessToken;
String? userInfo;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('OAuth Flutter Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
String clientId = 'YOUR_CLIENT_ID'; // 替换为你的GitHub OAuth客户端ID
String clientSecret = 'YOUR_CLIENT_SECRET'; // 替换为你的GitHub OAuth客户端密钥
String redirectUri = 'YOUR_REDIRECT_URI'; // 替换为你的重定向URI
String authorizationEndpoint = 'https://github.com/login/oauth/authorize';
String tokenEndpoint = 'https://github.com/login/oauth/access_token';
OAuth2 oauth2 = OAuth2(
clientId,
clientSecret,
redirectUri,
authorizationEndpoint,
tokenEndpoint,
);
OAuth2Credentials? credentials = await oauth2.authorize();
if (credentials != null) {
setState(() {
accessToken = credentials.accessToken;
_fetchUserInfo(credentials.accessToken!);
});
}
},
child: Text('Authorize with GitHub'),
),
SizedBox(height: 20),
if (accessToken != null)
Text('Access Token: $accessToken'),
SizedBox(height: 20),
if (userInfo != null)
Text('User Info: $userInfo'),
],
),
),
);
}
Future<void> _fetchUserInfo(String accessToken) async {
String userInfoEndpoint = 'https://api.github.com/user';
final response = await http.get(
Uri.parse(userInfoEndpoint),
headers: <String, String>{
'Authorization': 'Bearer $accessToken',
},
);
if (response.statusCode == 200) {
setState(() {
userInfo = jsonDecode(response.body).toString();
});
} else {
setState(() {
userInfo = 'Failed to fetch user info: ${response.statusCode}';
});
}
}
}
注意事项
-
替换占位符:
YOUR_CLIENT_ID
:你的GitHub OAuth应用的客户端ID。YOUR_CLIENT_SECRET
:你的GitHub OAuth应用的客户端密钥。YOUR_REDIRECT_URI
:你的重定向URI,通常是一个你控制的URL,用于接收OAuth回调。
-
依赖管理:
- 确保你的Flutter项目已经添加了
http
依赖,因为我们在示例中用它来发起HTTP请求。你可以在pubspec.yaml
中添加http: ^0.13.3
(使用最新版本)。
- 确保你的Flutter项目已经添加了
-
安全性:
- 不要在客户端代码中硬编码敏感信息,如客户端密钥。考虑使用环境变量或安全存储机制。
- 确保你的重定向URI是安全的,并且只处理来自可信来源的回调。
-
GitHub OAuth设置:
- 在GitHub上创建一个OAuth应用,获取客户端ID和密钥,并设置重定向URI。
这个示例展示了如何使用oauth_flutter
插件进行OAuth认证,并获取用户信息。根据你的需求,你可能需要调整代码来处理不同的OAuth提供者和API端点。