Flutter授权认证插件flutter_appauth_platform_interface的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter授权认证插件flutter_appauth_platform_interface的使用

1. 简介

flutter_appauth_platform_interfaceflutter_appauth 插件的公共平台接口。它为 iOS 和 Android 提供了一个统一的接口,用于实现 OAuth 2.0 和 OpenID Connect 授权认证。通过这个接口,开发者可以在 Flutter 应用中轻松集成第三方登录和身份验证功能。

2. 安装

首先,在 pubspec.yaml 文件中添加 flutter_appauth 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_appauth: ^4.5.0  # 请根据最新版本进行调整

然后,运行以下命令来安装依赖:

flutter pub get

3. 配置

3.1 iOS 配置

ios/Runner/Info.plist 文件中添加以下配置:

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>your.bundle.id</string>
    </array>
  </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>oauth2redirectgoogle</string>
  <string>com.googleusercontent.apps.your-client-id</string>
</array>
3.2 Android 配置

android/app/src/main/AndroidManifest.xml 文件中添加以下配置:

<activity
  android:name="net.openid.appauth.RedirectUriReceiverActivity"
  android:exported="true">
  <intent-filter>
    <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.scheme" android:host="your.host" />
  </intent-filter>
</activity>

4. 使用示例

下面是一个完整的示例代码,展示了如何使用 flutter_appauth 进行 OAuth 2.0 授权认证。

4.1 主要代码
import 'package:flutter/material.dart';
import 'package:flutter_appauth/flutter_appauth.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter AppAuth Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AuthorizationScreen(),
    );
  }
}

class AuthorizationScreen extends StatefulWidget {
  [@override](/user/override)
  _AuthorizationScreenState createState() => _AuthorizationScreenState();
}

class _AuthorizationScreenState extends State<AuthorizationScreen> {
  final FlutterAppAuth _appAuth = FlutterAppAuth();
  final storage = FlutterSecureStorage();
  String? _authorizationCode;
  String? _accessToken;

  final String _clientId = 'your-client-id';
  final String _redirectUrl = 'your.scheme://your.host/callback';
  final String _discoveryUrl = 'https://accounts.google.com/.well-known/openid-configuration';

  Future<void> _authorize() async {
    try {
      final result = await _appAuth.authorizeAndExchangeCode(
        AuthorizationTokenRequest(
          _clientId,
          _redirectUrl,
          discoveryUrl: _discoveryUrl,
          scopes: ['openid', 'profile', 'email'],
        ),
      );

      if (result != null) {
        setState(() {
          _authorizationCode = result.authorizationCode;
          _accessToken = result.accessToken;
        });

        // 保存访问令牌到安全存储
        await storage.write(key: 'access_token', value: result.accessToken);
      }
    } catch (e) {
      print('Authorization failed: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter AppAuth Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _authorize,
              child: Text('Authorize'),
            ),
            SizedBox(height: 20),
            _authorizationCode != null
                ? Text('Authorization Code: $_authorizationCode')
                : Container(),
            SizedBox(height: 20),
            _accessToken != null
                ? Text('Access Token: $_accessToken')
                : Container(),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,flutter_appauth_platform_interface 是一个 Flutter 插件,它提供了与 OAuth 2.0 和 OpenID Connect 兼容的授权认证接口。虽然它本身是一个接口层,通常需要与其他实现插件(如 flutter_appauth)一起使用,但我们可以展示如何使用这个接口层来实现基本的授权认证流程。

以下是一个使用 flutter_appauth 插件(它依赖于 flutter_appauth_platform_interface)的示例代码,展示了如何进行 OAuth 2.0 授权认证。

首先,确保在 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_appauth: ^x.y.z  # 替换为最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Flutter 应用中实现授权认证流程。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:flutter_appauth/flutter_appauth.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter AppAuth Demo'),
        ),
        body: Center(
          child: AuthorizationButton(
            authorizationServiceConfiguration: AuthorizationServiceConfiguration(
              authorizationEndpoint: Uri.parse('https://example.com/oauth/authorize'),
              tokenEndpoint: Uri.parse('https://example.com/oauth/token'),
            ),
            clientId: 'your-client-id',
            clientSecret: 'your-client-secret',  // 可选,某些情况下不需要
            redirectUri: Uri.parse('your-app-redirect-uri://callback'),
            scopes: ['read', 'write'],
            additionalParameters: {
              'state': 'xyz',  // 可选,用于防止跨站请求伪造
            },
            onCompleted: (result, error) {
              if (result != null) {
                // 处理成功的授权结果
                print('Credentials: ${result.credentials}');
                // 可以保存 credentials 到本地或进行其他处理
              } else {
                // 处理错误
                print('Authorization failed: ${error?.localizedDescription ?? 'Unknown error'}');
              }
            },
            onCanceled: () {
              // 处理用户取消授权
              print('Authorization canceled');
            },
            child: Text('Login with OAuth'),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们使用了 AuthorizationButton 组件,它封装了 OAuth 2.0 授权流程。你需要替换以下占位符为你的实际值:

  • https://example.com/oauth/authorizehttps://example.com/oauth/token:你的授权服务器和令牌端点。
  • your-client-idyour-client-secret:你的客户端 ID 和密钥(如果不需要客户端密钥,可以省略)。
  • your-app-redirect-uri://callback:你的重定向 URI,它应该与你在授权服务器上注册的 URI 相匹配。
  • scopes:你请求的权限范围。

onCompleted 回调会在授权成功或失败时被调用,onCanceled 回调会在用户取消授权时被调用。

注意:flutter_appauth_platform_interface 本身是一个低级别的接口层,通常不需要直接与其交互。而是通过 flutter_appauth 这样的高层插件来使用它。上述示例展示了如何使用 flutter_appauth 来实现 OAuth 2.0 授权认证。

回到顶部