在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流程,具体实现需根据提供商的文档调整。