Flutter OAuth2授权插件x_oauth2_pkce的使用

Flutter OAuth2授权插件x_oauth2_pkce的使用

x_oauth2_pkce

在Flutter应用中集成OAuth 2.0 PKCE的最优化和最简便方式 🐦


GitHub Sponsor GitHub Sponsor

v2 pub package Dart SDK Version Test Analyzer Issues Pull Requests Stars Code size Last Commits License Contributor Covenant


1. 指南 🌎 #

此库为在Flutter应用中通过OAuth 2.0 PKCE进行身份验证提供了最简便的方法。

支持项目,请给仓库点赞。

我们推荐将此库与封装了Twitter API v2.0twitter_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/`。

设置回调URI

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的内置处理程序。

使用此包的实现方法与上述AndroidiOS相同,但需要单独创建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&lt;Example&gt; createState() =&gt; _ExampleState();
}

class _ExampleState extends State&lt;Example&gt; {
  String? _accessToken;
  String? _refreshToken;

  @override
  Widget build(BuildContext context) =&gt; 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. 支持 ❤️ #

最简单的方式是通过在GitHubPub.dev给项目点赞来表示支持。

您也可以通过成为GitHub上的赞助者来支持此项目:

1.5. 许可证 🔑 #

x_oauth2_pkce的所有资源均根据BSD-3许可证提供。

FOSSA状态

注意
源代码中的许可证通知基于.github/header-checker-lint.yml严格验证。请检查header-checker-lint.yml以了解允许的标准。

1.6. 更多信息 🧐 #

x_oauth2_pkceKato Shinya ([@myConsciousness](/user/myConsciousness))设计和实现。


更多关于Flutter OAuth2授权插件x_oauth2_pkce的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于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();
回到顶部