在Flutter中实现OAuth认证,可以通过以下步骤完成:
1. 添加依赖
在 pubspec.yaml 中添加 flutter_web_auth 或 oauth2 包:
dependencies:
flutter_web_auth: ^0.4.1
oauth2: ^2.0.0
2. 配置OAuth参数
从OAuth服务提供商(如Google、GitHub)获取客户端ID、密钥和重定向URI。
3. 实现认证流程
使用 flutter_web_auth 打开认证页面并处理回调:
import 'package:flutter_web_auth/flutter_web_auth.dart';
import 'package:oauth2/oauth2.dart' as oauth2;
class OAuthService {
static const String authorizationEndpoint = 'https://example.com/oauth/authorize';
static const String tokenEndpoint = 'https://example.com/oauth/token';
static const String redirectUri = 'com.example.app://oauth-callback';
static const String clientId = 'YOUR_CLIENT_ID';
static const String clientSecret = 'YOUR_CLIENT_SECRET';
Future<oauth2.Client> authenticate() async {
final grant = oauth2.AuthorizationCodeGrant(
clientId,
Uri.parse(authorizationEndpoint),
Uri.parse(tokenEndpoint),
secret: clientSecret,
);
// 生成授权URL
final authorizationUrl = grant.getAuthorizationUrl(Uri.parse(redirectUri));
// 打开Web认证页面
final result = await FlutterWebAuth.authenticate(
url: authorizationUrl.toString(),
callbackUrlScheme: redirectUri.split(':')[0],
);
// 处理回调,获取访问令牌
final client = await grant.handleAuthorizationResponse(
Uri.parse(result).queryParameters,
);
return client;
}
}
4. 使用访问令牌
认证成功后,使用 client 访问受保护的API:
final response = await client.read(Uri.parse('https://api.example.com/user'));
5. 安全存储令牌
使用 flutter_secure_storage 安全保存令牌:
dependencies:
flutter_secure_storage: ^5.0.2
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
final storage = FlutterSecureStorage();
await storage.write(key: 'access_token', value: client.credentials.accessToken);
注意事项:
- 根据OAuth提供商的要求调整参数
- 在Android和iOS中配置URL Scheme
- 处理认证失败和异常情况
这种方法适用于大多数OAuth2流程,具体实现需根据提供商的文档调整。