Flutter Firebase管理插件firebase_admin的使用
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
更多关于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)
- 安装依赖
npm init -y
npm install express firebase-admin body-parser cors
- 创建服务器文件(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 应用
- 添加依赖
在pubspec.yaml
中添加http
依赖:
dependencies:
flutter:
sdk: flutter
http: ^0.13.3
- 生成令牌请求(在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应用。
请注意,这只是一个基本示例,实际生产环境中需要考虑安全性、错误处理、身份验证和授权等更多细节。