Flutter Firebase管理插件firebase_admin的使用

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

Flutter Firebase管理插件firebase_admin的使用

firebase_admin 是一个纯 Dart 实现的 Firebase Admin SDK。目前,它仅支持以下 Firebase 服务的管理方法:

  • 身份验证(Authentication)
  • 实时数据库(Realtime Database)

使用服务账户的示例

import 'package:firebase_admin/firebase_admin.dart';

void main() async {
  // 初始化 Firebase Admin 应用
  var app = FirebaseAdmin.instance.initializeApp(AppOptions(
    credential: ServiceAccountCredential('service-account.json'),
  ));

  // 生成用于电子邮件登录的链接
  var link = await app.auth().generateSignInWithEmailLink('jane@doe.com',
      ActionCodeSettings(url: 'https://example.com'));

  print(link);
}

使用默认凭据的示例

import 'package:firebase_admin/firebase_admin.dart';
import 'package:firebase_admin/src/credential.dart';

void main() async {
  // 获取默认凭据
  // applicationDefault() 将在以下位置查找凭据:
  // * 环境变量 GOOGLE_APPLICATION_CREDENTIALS
  // * 用户主目录中的特定配置文件
  // * gcloud 的默认凭据
  // * Firebase 工具的凭据
  var credential = Credentials.applicationDefault();

  // 如果没有找到凭据,则使用 OpenID 登录
  // 凭据将存储在磁盘上以供后续使用
  // 可以设置 login 方法的 clientId 和 clientSecret 参数,或设置环境变量 FIREBASE_CLIENT_ID 和 FIREBASE_CLIENT_SECRET
  credential ??= await Credentials.login();

  // 创建一个应用
  var app = FirebaseAdmin.instance.initializeApp(AppOptions(
      credential: credential ?? Credentials.applicationDefault(),
      projectId: 'some-project'));

  try {
    // 通过电子邮件获取用户
    var v = await app.auth().getUserByEmail('jane@doe.com');
    print(v.toJson());
  } on FirebaseException catch (e) {
    print(e.message);
  }
}

完整示例

import 'package:firebase_admin/firebase_admin.dart';

void main() async {
  // 获取默认凭据
  // applicationDefault() 将在以下位置查找凭据:
  // * 服务账户文件 service-account.json 在包的主目录中
  // * 环境变量 GOOGLE_APPLICATION_CREDENTIALS
  // * 用户主目录中的特定配置文件
  // * gcloud 的默认凭据
  // * Firebase 工具的凭据
  var credential = Credentials.applicationDefault();

  // 如果没有找到凭据,则使用 OpenID 登录
  // 凭据将存储在磁盘上以供后续使用
  // 可以设置 login 方法的 clientId 和 clientSecret 参数,或设置环境变量 FIREBASE_CLIENT_ID 和 FIREBASE_CLIENT_SECRET
  credential ??= await Credentials.login();

  var projectId = 'some-project';
  // 创建一个应用
  var app = FirebaseAdmin.instance.initializeApp(AppOptions(
      credential: credential,
      projectId: projectId,
      storageBucket: '$projectId.appspot.com'));

  try {
    // 通过电子邮件获取用户
    var v = await app.auth().getUserByEmail('jane@doe.com');
    print(v.toJson());
  } on FirebaseException catch (e) {
    print(e.message);
  }

  // 列出存储桶中的所有对象
  await for (var v in app.storage().bucket().list()) {
    print(v.name);
  }
}

特性和问题

请在 GitHub 问题跟踪器 上提交功能请求和 Bug。

赞助

创建和维护此包需要大量时间。如果您喜欢这个结果,请考虑 ❤️ 赞助。 您的支持将帮助我进一步改进和支持这个项目。此外,您还可以在我的 pub.dev 页面上查看其他 Dart 包。


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

1 回复

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


在Flutter应用中,直接使用firebase_admin插件并不常见,因为firebase_admin主要是为Node.js服务器端环境设计的,用于管理Firebase项目的各种后端操作(如身份验证、数据库管理、云消息传递等)。Flutter是一个跨平台的移动开发框架,通常使用Firebase提供的客户端SDK来进行与Firebase服务的交互。

然而,如果你确实需要在Flutter应用中执行一些类似firebase_admin的服务器端操作(例如,生成自定义令牌用于身份验证),你通常会设置一个独立的Node.js服务器来处理这些操作,然后通过Flutter应用与该服务器进行通信。

以下是一个简化的示例,展示了如何在Node.js服务器上使用firebase-admin来生成自定义令牌,并在Flutter应用中调用这个服务器API。

Node.js 服务器(使用 Express 和 firebase-admin)

  1. 安装依赖
npm init -y
npm install express firebase-admin body-parser cors
  1. 创建服务器文件(server.js)
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const admin = require('firebase-admin');

const app = express();
app.use(bodyParser.json());
app.use(cors({origin: 'http://localhost:5000'})); // 允许Flutter开发服务器的跨域请求

// 替换为你的Firebase服务帐户密钥文件路径
const serviceAccount = require('./path/to/serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://<your-database-name>.firebaseio.com"
});

app.post('/generate-token', async (req, res) => {
  const {uid, claims} = req.body;

  try {
    const customToken = await admin.auth().createCustomToken(uid, claims);
    res.status(200).json({token: customToken});
  } catch (error) {
    console.error('Error generating custom token:', error);
    res.status(500).json({error: error.message});
  }
});

const PORT = process.env.PORT || 5001;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

Flutter 应用

  1. 添加依赖

pubspec.yaml中添加http依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3
  1. 生成令牌请求(在Flutter中)
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Firebase Admin Token Generator'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              String uid = 'your-user-uid'; // 替换为实际的用户UID
              Map<String, dynamic> claims = {
                // 你可以在这里添加任何自定义声明
              };

              var response = await http.post(
                Uri.parse('http://localhost:5001/generate-token'),
                body: jsonEncode({
                  'uid': uid,
                  'claims': claims,
                }),
                headers: {
                  'Content-Type': 'application/json',
                },
              );

              if (response.statusCode == 200) {
                var data = jsonDecode(response.body);
                print('Generated Token: ${data['token']}');
                // 你可以在这里使用生成的令牌
              } else {
                print('Error generating token: ${response.body}');
              }
            },
            child: Text('Generate Token'),
          ),
        ),
      ),
    );
  }
}

在这个例子中,Flutter应用通过HTTP POST请求向Node.js服务器发送用户UID和任何自定义声明。服务器使用firebase-admin SDK生成一个自定义Firebase身份验证令牌,并将其返回给Flutter应用。

请注意,这只是一个基本示例,实际生产环境中需要考虑安全性、错误处理、身份验证和授权等更多细节。

回到顶部