Flutter魔法功能集成插件magic_sdk的使用

Flutter魔法功能集成插件magic_sdk的使用

概述

Magic 允许开发者通过创新的无密码认证流程来保护用户,而不会影响传统 OAuth 实现的用户体验。

移除 loginWithMagicLink()

v4.0.0 版本起,所有移动 SDK 中的 Magic 链接(如 loginWithMagicLink())已被短信验证码(如 loginWithSMS()loginWithEmailOTP())所取代。了解更多 此处

功能特性

这是您进入安全无密码认证的世界的入口,适用于基于 iOS 或 Android 的 Flutter 应用。

安装

在您的 pubspec.yaml 文件中添加 magic_sdk 依赖:

dependencies:
  flutter:
    sdk: flutter
  magic_sdk: ^4.0.0

运行以下命令以安装依赖:

$ dart pub get

创建SDK实例

main.dart 文件中,使用您的发布密钥实例化 Magic:

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

  Magic.instance = Magic("YOUR_PUBLISHABLE_KEY");
}

使用 Stack 在顶层,并将 Magic.instance.relayer 添加到 Stack 的子元素中,以确保最佳性能。注意:Relayer 是用于在应用和服务之间建立通信的必要组件。确保在需要认证或与区块链交互时始终包含它。

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Magic Demo',
        home: Stack(children: [
          const LoginPage(),
          Magic.instance.relayer
        ]));
  }
}

认证第一个用户

使用以下代码进行用户认证:

var token = await magic.auth.loginWithEmailOTP(email: textController.text);

其他信息

更多详细信息,请参阅 Magic Link Flutter 文档


示例代码

以下是一个完整的示例代码,展示了如何使用 magic_sdk 进行用户登录。

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

class LoginPage extends StatefulWidget {
  const LoginPage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<LoginPage> createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  Magic magic = Magic.instance;

  final myController = TextEditingController(text: 'your.email@example.com');

  [@override](/user/override)
  void initState() {
    super.initState();

    /// Checks if the user is already logged in
    var future = magic.user.isLoggedIn();
    future.then((isLoggedIn) {
      if (isLoggedIn) {
        /// Navigate to home page
        // Navigator.push(context,
        //     MaterialPageRoute(builder: (context) => const HomePage()));
      }
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('Magic Demo Login'),
          automaticallyImplyLeading: false,
        ),
        body: Center(
            child:
                Column(mainAxisAlignment: MainAxisAlignment.center, children: [
          Padding(
            padding: const EdgeInsets.symmetric(horizontal: 32.0),
            child: TextFormField(
              controller: myController,
              decoration: const InputDecoration(
                hintText: 'Enter your email',
              ),
              validator: (String? value) {
                if (value == null || value.isEmpty) {
                  return 'Please enter your email';
                }
                return null;
              },
            ),
          ),
          TextButton(
            style: ButtonStyle(
              foregroundColor: MaterialStateProperty.all<Color>(Colors.blue),
            ),
            onPressed: () async {
              var token =
                  await magic.auth.loginWithEmailOTP(email: myController.text);
              debugPrint('token, $token');

              if (token.isNotEmpty) {
                /// Navigate to home page
                // Navigator.push(context,
                //     MaterialPageRoute(builder: (context) => const HomePage()));
              }
            },
            child: const Text('Login With Magic Email OTP'),
          ),
        ])));
  }
}

更多关于Flutter魔法功能集成插件magic_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter魔法功能集成插件magic_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


magic_sdk 是一个用于集成 Magic 身份验证服务的 Flutter 插件。Magic 是一个无密码身份验证解决方案,允许用户通过电子邮件或社交登录进行身份验证,而无需处理密码。通过 magic_sdk 插件,你可以在 Flutter 应用中轻松集成 Magic 的身份验证功能。

以下是如何在 Flutter 项目中使用 magic_sdk 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 magic_sdk 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  magic_sdk: ^1.0.0 # 请使用最新版本

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

2. 初始化 Magic

在你的 Flutter 项目中,首先需要初始化 Magic。通常,你可以在 main.dart 文件中进行初始化。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 Magic
  await Magic.instance.initialize(
    apiKey: 'YOUR_MAGIC_API_KEY', // 替换为你的 Magic API Key
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Magic Demo',
      home: MagicLoginScreen(),
    );
  }
}

3. 实现登录功能

接下来,你可以创建一个登录页面,使用 Magic 进行无密码登录。

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

class MagicLoginScreen extends StatefulWidget {
  @override
  _MagicLoginScreenState createState() => _MagicLoginScreenState();
}

class _MagicLoginScreenState extends State<MagicLoginScreen> {
  final _emailController = TextEditingController();

  Future<void> _loginWithEmail() async {
    try {
      final email = _emailController.text.trim();
      if (email.isEmpty) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Please enter your email')),
        );
        return;
      }

      // 使用 Magic 进行登录
      final didToken = await Magic.instance.auth.loginWithMagicLink(email: email);

      // 登录成功后,你可以将 didToken 发送到你的后端进行验证
      print('DID Token: $didToken');

      // 导航到主页
      Navigator.pushReplacement(
        context,
        MaterialPageRoute(builder: (context) => HomeScreen()),
      );
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Login failed: $e')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Magic Login'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _emailController,
              decoration: InputDecoration(
                labelText: 'Email',
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _loginWithEmail,
              child: Text('Login with Magic Link'),
            ),
          ],
        ),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: Text('Welcome!'),
      ),
    );
  }
}

4. 处理用户会话

Magic 会管理用户的会话状态。你可以使用 Magic.instance.user 来获取当前用户的信息,或者检查用户是否已经登录。

Future<void> checkUserSession() async {
  final isLoggedIn = await Magic.instance.user.isLoggedIn();
  if (isLoggedIn) {
    final userMetadata = await Magic.instance.user.getMetadata();
    print('User is logged in: $userMetadata');
  } else {
    print('User is not logged in');
  }
}

5. 退出登录

当用户想要退出登录时,你可以调用 logout 方法来结束会话。

Future<void> _logout() async {
  await Magic.instance.user.logout();
  // 导航回登录页面
  Navigator.pushReplacement(
    context,
    MaterialPageRoute(builder: (context) => MagicLoginScreen()),
  );
}

6. 处理 Magic 事件

Magic 提供了一些事件监听器,你可以监听这些事件来处理用户登录或登出等操作。

Magic.instance.onEvent.listen((event) {
  if (event.type == MagicEventType.Login) {
    print('User logged in');
  } else if (event.type == MagicEventType.Logout) {
    print('User logged out');
  }
});
回到顶部