Flutter Mastodon OAuth2认证插件mastodon_oauth2的使用

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

Flutter Mastodon OAuth2认证插件mastodon_oauth2的使用

mastodon_oauth2

在Flutter应用中集成Mastodon API的最优化和最简单的方式 🎯


GitHub Sponsor GitHub Sponsor

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


1. 指南 🌎

该库提供了在Flutter应用中使用OAuth 2.0Mastodon API进行身份验证的最简单方式。

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

1.1. 开始使用 ⚡

1.1.1. 安装库

flutter pub add mastodon_oauth2

1.1.2. 导入库

import 'package:mastodon_oauth2/mastodon_oauth2.dart';

1.1.3. 设置

1.1.3.1. Android

在Android上,你必须首先在build.gradle文件中设置minSdkVersion:

defaultConfig {
   ...
   minSdkVersion 18
   ...
}

接下来,让我们将org.example.oauth://callback/设置为你的开发者页面中的回调URI。

你可以通过以下链接查看Mastodon的开发者页面

然后,在开发者页面中指定你的redirect uri

设置回调URI

还需要向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.oauth" android:host="callback" />
    </intent-filter>
</activity>

最后,你需要将此重定向URL设置到MastodonOAuth2Client中。

final oauth2 = MastodonOAuth2Client(
  // 指定Mastodon实例,如 "mastodon.social"
  instance: 'MASTODON_INSTANCE',
  clientId: 'YOUR_CLIENT_ID',
  clientSecret: 'YOUR_CLIENT_SECRET',
  redirectUri: 'org.example.oauth://callback/',
  customUriScheme: 'org.example.oauth',
);

详情可见这里

1.1.3.2. iOS

在iOS上,你需要在ios/Podfile文件中设置平台:

platform :ios, '11.0'

MastodonOAuth2Client的使用方法与Android相同。

1.1.3.3. Web

对于Web,使用此包的实现方法与AndroidiOS相同,但需要单独创建HTML用于认证后的重定向目的地。

首先,你需要在web文件夹下直接创建以下HTML,以准备在Web浏览器中进行OAuth认证。然后,将此HTML文件保存为auth.html

<!DOCTYPE html>
<title>认证完成</title>
<p>
  认证已完成。如果这没有自动发生,请关闭窗口。
  <script>
    window.opener.postMessage(window.location.href, window.location.origin);
    window.close();
  </script>
</p>

现在你的web文件夹应该看起来像这样

设置auth.html

然后,与Android和iOS不同,重定向URL应指向此创建的auth.html。因此,现在将其设置为http://localhost:5555/auth.html

设置Web重定向uri

最后,你需要将此重定向URL设置到MastodonOAuth2Client中。

final oauth2 = MastodonOAuth2Client(
  // 指定Mastodon实例,如 "mastodon.social"
  instance: 'MASTODON_INSTANCE',
  clientId: 'YOUR_CLIENT_ID',
  clientSecret: 'YOUR_CLIENT_SECRET',
  redirectUri: 'http://localhost:5555/auth.html',
  customUriScheme: 'http://localhost:5555/auth.html',
);

1.1.4. 实现

现在所有的工作都已经完成了,运行以下示例Flutter应用并按下按钮开始使用OAuth 2.0进行身份验证!

点击授权按钮后,会执行重定向操作,并且你会看到你已经获得了bearer token

import 'package:flutter/material.dart';

import 'package:mastodon_oauth2/mastodon_oauth2.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;

  @override
  Widget build(BuildContext context) =&gt; Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Text('Access Token: $_accessToken'),
              ElevatedButton(
                onPressed: () async {
                  final oauth2 = MastodonOAuth2Client(
                    // 指定Mastodon实例,如 "mastodon.social"
                    instance: 'MASTODON_INSTANCE',
                    clientId: 'YOUR_CLIENT_ID',
                    clientSecret: 'YOUR_CLIENT_SECRET',

                    // 替换重定向URL
                    redirectUri: 'org.example.oauth://callback/',
                    customUriScheme: 'org.example.oauth',
                  );

                  final response = await oauth2.executeAuthCodeFlow(
                    scopes: [
                      Scope.read,
                      Scope.write,
                    ],
                  );

                  super.setState(() {
                    _accessToken = response.accessToken;
                  });
                },
                child: const Text('推送!'),
              )
            ],
          ),
        ),
      );
}

1.2. 贡献 🏆

如果你希望为mastodon-oauth2贡献代码,请创建一个问题或创建一个Pull Request。

有很多方式可以为开源项目做出贡献。例如,以下主题可以考虑:

  • 还有一些作用域未被实现。
  • 文档已过时或不完整。
  • 有更好的方法或想法来实现功能。
  • 等等…

你可以从以下资源中获取更多详细信息:

或者,如果你喜欢,你可以创建一个讨论

欢迎加入开发,不同的观点使软件更好!

1.3. 贡献者 ✨

感谢这些了不起的人(表情符号键):

Shinya Kato / 加藤 真也
Shinya Kato / 加藤 真也

💻 📖 🎨 💡 🚧 ⚠️
Mark O'Sullivan
Mark O'Sullivan

🤔
Abraham Williams
Abraham Williams

💻 📖 ⚠️
YeongJun
YeongJun

📖 🤔

本项目遵循all-contributors规范。欢迎任何形式的贡献!

1.4. 支持 ❤️

展示你支持的最简单方法是在GitHubPub.dev上给项目点个赞。

你也可以通过在GitHub上成为赞助者来支持这个项目:

1.5. 许可证 🔑

mastodon_oauth2的所有资源都基于BSD-3许可证提供。

Copyright 2022 Kato Shinya. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided the conditions.

注意
源代码中的许可证声明严格基于.github/header-checker-lint.yml进行验证。请检查header-checker-lint.yml以获取允许的标准。

1.6. 更多信息 🧐

mastodon_oauth2Kato Shinya (@myConsciousness)设计和实现。


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

1 回复

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


当然,以下是如何在Flutter应用中使用mastodon_oauth2插件来实现Mastodon OAuth2认证的示例代码。这个插件允许你通过OAuth2流程在Flutter应用中认证用户并获取访问令牌。

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

dependencies:
  flutter:
    sdk: flutter
  mastodon_oauth2: ^最新版本号  # 替换为最新的版本号

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

接下来,以下是一个简单的示例,展示如何使用mastodon_oauth2插件进行OAuth2认证:

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

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

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

class OAuth2Demo extends StatefulWidget {
  @override
  _OAuth2DemoState createState() => _OAuth2DemoState();
}

class _OAuth2DemoState extends State<OAuth2Demo> {
  final String clientId = '你的客户端ID';
  final String clientSecret = '你的客户端密钥';
  final String redirectUri = '你的回调URI';
  final String mastodonInstanceUrl = '你的Mastodon实例URL';
  String accessToken;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Mastodon OAuth2 Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Access Token: $accessToken',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                try {
                  final mastodonOAuth2 = MastodonOAuth2(
                    clientId: clientId,
                    clientSecret: clientSecret,
                    redirectUri: redirectUri,
                    mastodonInstanceUrl: mastodonInstanceUrl,
                  );

                  final authorizationUrl = await mastodonOAuth2.getAuthorizationUrl();
                  // 在这里,你需要打开一个浏览器或WebView来访问authorizationUrl
                  // 用户登录并授权后,他们将被重定向到你的redirectUri
                  // 你需要在你的redirectUri处理回调,并获取code参数
                  // 假设你已经通过某种方式获取了code,现在用它来交换访问令牌

                  // 模拟获取到的code(在实际应用中,你需要从回调URI中提取code)
                  final String code = '用户授权后的code';

                  final tokenResponse = await mastodonOAuth2.getToken(code);
                  setState(() {
                    accessToken = tokenResponse.accessToken;
                  });
                } catch (e) {
                  print('Error: $e');
                }
              },
              child: Text('Authenticate'),
            ),
          ],
        ),
      ),
    );
  }
}

注意

  1. 在实际应用中,你不能直接在Flutter应用中打开一个浏览器窗口来获取授权码。你需要在你的应用中嵌入一个WebView或者使用设备的默认浏览器,并处理回调URI。
  2. 回调URI需要在你的Mastodon应用设置中配置,并且你需要能够捕获回调URI中的code参数。
  3. 上面的代码示例中,code是硬编码的,但在实际应用中,你需要从回调URI中提取这个code

你可能需要一些额外的逻辑来处理WebView的打开和回调URI的捕获,这通常涉及到平台特定的代码(如使用url_launcherwebview_flutter插件)。由于篇幅限制,这里不展开详述,但你可以查阅相关插件的文档来实现这些功能。

回到顶部