Flutter OAuth认证插件magic_ext_oauth的使用

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

Flutter OAuth认证插件magic_ext_oauth的使用

Magic 提供了一种创新的方法来保护您的用户,通过无密码认证流,而不会像传统的OAuth实现那样影响用户体验。

功能

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

安装

pubspec.yaml 文件中添加 magic_sdkmagic_ext_oauth

dependencies:
  flutter:
    sdk: flutter
  magic_sdk: ^4.0.0
  magic_ext_oauth: ^0.3.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 是建立应用与 Magic 服务之间通信所必需的。确保在需要进行身份验证或与区块链交互时包含它。

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

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

使用OAuth进行身份验证

现在您可以使用OAuth进行身份验证了!以下是如何使用GitHub作为OAuth提供者进行登录的示例:

import 'package:magic_sdk/magic_sdk.dart';
import 'package:magic_ext_oauth/magic_ext_oauth.dart';

// 创建OAuth配置对象
var configuration = OAuthConfiguration(provider: OAuthProvider.GITHUB, redirectURI: 'YOUR_APP_SCHEME://');

// 执行登录操作
var result = await magic.oauth.loginWithPopup(configuration);

如果登录成功,您可以通过 result.magic.userInfo.email 访问用户信息。

示例代码

以下是完整的示例代码,展示了如何在Flutter应用中使用 magic_ext_oauth 进行OAuth身份验证。

import 'package:flutter/material.dart';
import 'package:magic_sdk/magic_sdk.dart';
import 'package:magic_ext_oauth/magic_ext_oauth.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();

    // 检查用户是否已登录
    var future = magic.user.isLoggedIn();
    future.then((isLoggedIn) {
      if (isLoggedIn) {
        // 导航到主页
        // 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 {
                // 创建OAuth配置对象
                var configuration = OAuthConfiguration(
                    provider: OAuthProvider.GITHUB,
                    redirectURI: 'link.magic.demo://');

                // 执行登录操作
                var result = await magic.oauth.loginWithPopup(configuration);

                if (result.magic!.userInfo!.email != null) {
                  // 导航到新页面
                  // Navigator.push(context, MaterialPageRoute(builder: (context) => const HomePage()));
                }
                debugPrint(
                    'publicAddress, ${result.magic!.userInfo!.publicAddress}');
              },
              child: const Text('Github Login'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


在Flutter中,使用magic_ext_oauth插件进行OAuth认证可以让你轻松集成第三方身份认证服务。以下是一个简单的代码示例,展示了如何使用这个插件进行OAuth认证。

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

dependencies:
  flutter:
    sdk: flutter
  magic_ext_oauth: ^最新版本号  # 请替换为实际发布的最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤进行OAuth认证:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:magic_ext_oauth/magic_ext_oauth.dart';
  1. 配置OAuth插件

在你的应用的初始化部分(如main.dartMyApp类中),配置MagicExtOauth插件。这通常包括设置客户端ID、客户端密钥和重定向URI等信息。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 初始化MagicExtOauth插件
    MagicExtOauth.init(
      clientId: '你的客户端ID',
      clientSecret: '你的客户端密钥', // 如果需要的话
      redirectUri: '你的重定向URI',
    );

    return MaterialApp(
      title: 'Flutter OAuth Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: OAuthScreen(),
    );
  }
}

注意:客户端ID、客户端密钥和重定向URI需要根据你的OAuth服务提供商(如Google、Facebook等)提供的实际值进行替换。

  1. 实现OAuth认证流程

在你的主屏幕或任何需要触发OAuth认证的页面上,添加一个按钮来启动认证流程。

class OAuthScreen extends StatefulWidget {
  @override
  _OAuthScreenState createState() => _OAuthScreenState();
}

class _OAuthScreenState extends State<OAuthScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('OAuth Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            try {
              // 启动OAuth认证流程
              String? accessToken = await MagicExtOauth.authorize(
                provider: 'google', // 替换为你使用的OAuth服务提供商
                scopes: ['profile', 'email'], // 根据需要添加scope
              );

              if (accessToken != null) {
                // 成功获取access token,进行后续操作
                print('Access Token: $accessToken');
                // 例如,使用access token获取用户信息
                // var userInfo = await fetchUserInfo(accessToken);
              } else {
                print('OAuth认证失败或用户取消');
              }
            } catch (e) {
              print('OAuth认证过程中发生错误: $e');
            }
          },
          child: Text('登录'),
        ),
      ),
    );
  }
}

在这个示例中,当用户点击“登录”按钮时,MagicExtOauth.authorize方法会被调用,启动OAuth认证流程。认证成功后,你将获得一个access token,可以用于后续的用户信息获取或其他API调用。

请注意,MagicExtOauth插件的具体使用方法和API可能会根据版本的不同而有所变化。因此,建议查阅最新的官方文档或插件的README文件以获取最准确的信息。

此外,对于实际的生产环境,务必确保妥善处理敏感信息(如客户端ID和密钥),并遵循最佳的安全实践。

回到顶部