Flutter OAuth认证插件oauth_flutter的使用

发布于 1周前 作者 gougou168 来自 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

1 回复

更多关于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}';
      });
    }
  }
}

注意事项

  1. 替换占位符

    • YOUR_CLIENT_ID:你的GitHub OAuth应用的客户端ID。
    • YOUR_CLIENT_SECRET:你的GitHub OAuth应用的客户端密钥。
    • YOUR_REDIRECT_URI:你的重定向URI,通常是一个你控制的URL,用于接收OAuth回调。
  2. 依赖管理

    • 确保你的Flutter项目已经添加了http依赖,因为我们在示例中用它来发起HTTP请求。你可以在pubspec.yaml中添加http: ^0.13.3(使用最新版本)。
  3. 安全性

    • 不要在客户端代码中硬编码敏感信息,如客户端密钥。考虑使用环境变量或安全存储机制。
    • 确保你的重定向URI是安全的,并且只处理来自可信来源的回调。
  4. GitHub OAuth设置

    • 在GitHub上创建一个OAuth应用,获取客户端ID和密钥,并设置重定向URI。

这个示例展示了如何使用oauth_flutter插件进行OAuth认证,并获取用户信息。根据你的需求,你可能需要调整代码来处理不同的OAuth提供者和API端点。

回到顶部