Flutter认证授权插件corbado_auth的使用

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

Flutter认证授权插件corbado_auth的使用

1. 简介

Corbado Auth 是一个用于 Flutter 的身份验证 SDK,支持通过 passkeys(基于 WebAuthn / FIDO2)进行用户注册和登录。该插件还提供了条件 UI、电子邮件 OTP 作为备用机制以及会话管理等功能。

2. 支持平台

平台 Android iOS Linux macOS Web Windows
支持

3. 功能特点

  • 使用 Corbado 作为依赖方服务器,通过 passkeys 在 iOS、Android 和 Web 上注册和登录用户。
  • 提供条件 UI 登录。
  • 支持电子邮件 OTP 作为备用机制。
  • 使用 Corbado 的会话管理,保持用户登录状态,自动刷新令牌。

4. 入门指南

要使用 corbado_auth 插件,您需要创建一个免费的 Corbado 项目,并配置您的 Flutter 应用程序。以下是详细的步骤:

4.1 创建 Corbado 项目

  1. 访问 Corbado 开发者面板并创建一个免费项目。
  2. 获取项目的 projectIdcustomDomain

4.2 配置 Flutter 项目

  1. pubspec.yaml 文件中添加 corbado_auth 依赖:

    dependencies:
      corbado_auth: ^latest_version
    
  2. 初始化 Corbado Auth:

    import 'package:corbado_auth/corbado_auth.dart';
    
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      // 显示加载页面
      runApp(const LoadingPage());
    
      // 初始化 Corbado Auth
      final projectId = calculateProjectID();
      final customDomain = 'https://$projectId.frontendapi.cloud.corbado.io';
      final corbadoAuth = CorbadoAuth();
      await corbadoAuth.init(projectId: projectId, customDomain: customDomain);
    
      // 覆盖提供者
      runApp(ProviderScope(
        overrides: [
          corbadoProvider.overrideWithValue(corbadoAuth),
        ],
        child: const MyApp(),
      ));
    }
    
  3. 实现路由和页面:

    • router.dart:处理基于认证状态的路由。
    • auth_provider.dart:设置 Riverpod 提供者,使认证状态和功能在整个应用中可用。
    • pages/auth_page.dart:定义加载 Corbado 认证屏幕的页面。
    • screens/*.dart:实现自定义的 Flutter 组件,每个组件必须实现 CorbadoScreen<T>,其中 T 是 5 个支持的 Corbado 块之一。

5. 示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中集成 corbado_auth 插件。

import 'package:corbado_auth/corbado_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:overlay_support/overlay_support.dart';
import 'router.dart';
import 'auth_provider.dart';
import 'pages/loading_page.dart';

// 计算项目 ID
String calculateProjectID() {
  if (kIsWeb) {
    return 'pro-4268394291597054564'; // 替换为您的项目 ID
  } else {
    return 'pro-4268394291597054564'; // 替换为您的项目 ID
  }
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 显示加载页面
  runApp(const LoadingPage());

  // 初始化 Corbado Auth
  final projectId = calculateProjectID();
  final customDomain = 'https://$projectId.frontendapi.cloud.corbado.io';
  final corbadoAuth = CorbadoAuth();
  await corbadoAuth.init(projectId: projectId, customDomain: customDomain);

  // 覆盖提供者并启动应用
  runApp(ProviderScope(
    overrides: [
      corbadoProvider.overrideWithValue(corbadoAuth),
    ],
    child: const MyApp(),
  ));
}

class MyApp extends ConsumerWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final router = ref.watch(routerProvider);

    return OverlaySupport.global(
      child: MaterialApp.router(
        routeInformationParser: router.routeInformationParser,
        routerDelegate: router.routerDelegate,
        routeInformationProvider: router.routeInformationProvider,
        theme: ThemeData(
          useMaterial3: false,
          colorScheme: const ColorScheme(
            brightness: Brightness.light,
            primary: Color(0xFF1953ff),
            onPrimary: Colors.white,
            secondary: Colors.white,
            onSecondary: Color(0xFF1953ff),
            error: Colors.redAccent,
            onError: Colors.white,
            background: Color(0xFF1953ff),
            onBackground: Colors.white,
            surface: Color(0xFF1953ff),
            onSurface: Color(0xFF1953ff),
          ),
        ),
      ),
    );
  }
}

6. Corbado 块概述

Corbado 块是用于定义认证流程中不同屏幕的功能和数据的抽象。目前有 5 个 Corbado 块:

  • SignupInitBlock:用于发起注册,要求用户提供唯一标识符(如电子邮件)和可选的全名。
  • PasskeyAppendBlock:用于创建新的 passkey。
  • EmailVerifyBlock:用于验证用户的电子邮件地址。
  • LoginInitBlock:用于发起登录,要求用户提供唯一标识符(如电子邮件)。
  • PasskeyVerifyBlock:用于验证用户的 passkey。

7. Flutter Web 注意事项

如果您要在 Flutter Web 应用中使用 corbado_auth,需要在 index.html 中包含 JavaScript 代码:

<script src="https://github.com/corbado/flutter-passkeys/releases/download/3.0.0/bundle.js" type="application/javascript"></script>

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

1 回复

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


当然,以下是如何在Flutter项目中使用corbado_auth插件进行认证授权的示例代码。请注意,实际使用时,你可能需要根据自己的需求调整代码,并确保你已经按照插件的官方文档完成了所有必要的配置。

首先,确保你已经在pubspec.yaml文件中添加了corbado_auth依赖:

dependencies:
  flutter:
    sdk: flutter
  corbado_auth: ^最新版本号  # 替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们编写一个简单的Flutter应用,展示如何使用corbado_auth进行认证授权。以下是一个基本的例子:

main.dart

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Auth Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AuthScreen(),
    );
  }
}

class AuthScreen extends StatefulWidget {
  @override
  _AuthScreenState createState() => _AuthScreenState();
}

class _AuthScreenState extends State<AuthScreen> {
  final CorbadoAuth _auth = CorbadoAuth();
  bool _isAuthenticated = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Auth Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _isAuthenticated ? 'You are authenticated' : 'You are not authenticated',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                try {
                  // 假设你需要使用某种形式的凭证进行认证,这里使用硬编码的示例
                  var credentials = Credentials(username: 'testuser', password: 'testpass');
                  var authResult = await _auth.authenticate(credentials);

                  if (authResult.isAuthenticated) {
                    setState(() {
                      _isAuthenticated = true;
                    });
                    // 可以在这里处理认证后的逻辑,比如保存token,导航到主屏幕等
                  } else {
                    // 处理认证失败的情况
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(content: Text('Authentication failed')),
                    );
                  }
                } catch (e) {
                  // 处理异常
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('An error occurred: $e')),
                  );
                }
              },
              child: Text('Authenticate'),
            ),
          ],
        ),
      ),
    );
  }
}

// 假设Credentials是一个简单的数据类,用于存储用户名和密码
class Credentials {
  String username;
  String password;

  Credentials({required this.username, required this.password});
}

注意事项

  1. 凭证处理:上面的示例中,Credentials类用于存储用户名和密码,这是一个非常基础的实现。在实际应用中,你可能需要更复杂的凭证处理逻辑,比如从输入框获取用户输入,或者处理OAuth、JWT等更复杂的认证机制。

  2. 错误处理:示例中简单地使用ScaffoldMessenger.of(context).showSnackBar来显示错误信息。在实际应用中,你可能需要更复杂的错误处理逻辑,比如重试机制、用户反馈等。

  3. 安全性:不要在生产环境中硬编码用户名和密码。你应该使用安全的凭证存储和检索方法,比如使用密钥库(keystore)或密钥管理服务(KMS)。

  4. 插件配置:确保你已经按照corbado_auth插件的官方文档完成了所有必要的配置,比如后端服务的URL、客户端ID和密钥等。

  5. 依赖版本:上面的代码示例中使用了^最新版本号来指定依赖版本。在实际项目中,你应该指定一个具体的、经过测试的版本号,以避免因依赖更新而导致的不稳定问题。

希望这个示例能帮助你开始使用corbado_auth插件进行认证授权。如果你有进一步的问题或需要更详细的指导,请查阅插件的官方文档或社区资源。

回到顶部