Flutter身份验证插件firebase_verify_id_tokens的使用
Flutter身份验证插件firebase_verify_id_tokens的使用
特性
- 验证Firebase令牌ID
- 从令牌中提取用户的UID
开始使用
你需要知道用户登录的Firebase项目的ID。
使用方法
以下是一个简单的示例代码,展示了如何使用firebase_verify_id_tokens
包来验证Firebase令牌ID并获取用户的UID。
import 'package:firebase_verify_id_tokens/firebase_verify_id_tokens.dart';
void main() async {
// 初始化Firebase项目ID
final firebaseTokenVerifier = FirebaseVerifyTokenId('your_firebase_project_id');
// 示例JWT令牌
final jwtToken = 'your_jwt_token';
// 获取用户的UID
final uid = await firebaseTokenVerifier.getUidFromToken(jwtToken);
// 打印用户的UID
print('Hello user $uid');
}
完整示例Demo
以下是一个完整的示例,展示了一个使用firebase_verify_id_tokens
包创建中间件的Dart服务器。该中间件用于验证Firebase ID令牌的有效性,并将用户的UID传递给请求。
import 'dart:io';
import 'package:firebase_verify_id_tokens/firebase_verify_id_tokens.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart';
import 'package:shelf_router/shelf_router.dart';
// 自定义认证异常类
class AuthException implements Exception {
const AuthException(this.message);
final String message;
@override
String toString() => 'AuthException: $message';
}
// Firebase认证中间件
Middleware firebaseAuthMiddleware() {
return (Handler innerHandler) {
return (Request request) async {
try {
final authHeader = request.headers['Authorization'];
if (authHeader == null) {
throw AuthException('Missing Authorization header');
}
final uid = await firebaseTokenVerifier.getUidFromToken(authHeader);
return innerHandler(request.change(context: {'uid': uid}));
} on FirebaseIdTokenException catch (e) {
return Response.forbidden(e.message);
} on AuthException catch (e) {
return Response.forbidden(e.message);
} catch (e) {
return Response.internalServerError(body: 'Internal server error');
}
};
};
}
// 路由处理器
final _router = Router()..get('/', _rootHandler);
Response _rootHandler(Request request) {
final uid = request.context['uid'] as String;
return Response.ok('Hello, $uid');
}
// 初始化Firebase令牌验证器
late final FirebaseVerifyTokenId firebaseTokenVerifier;
void main(List<String> args) async {
if (Platform.environment['FIREBASE_PROJECT_ID'] == null) {
print('Missing FIREBASE_PROJECT_ID environment variable');
exit(1);
}
// 初始化Firebase项目ID
firebaseTokenVerifier =
FirebaseVerifyTokenId(Platform.environment['FIREBASE_PROJECT_ID']!);
await firebaseTokenVerifier.initGooglePublicKeysCache();
// 使用任何可用的主机或容器IP(通常是 `0.0.0.0`)。
final ip = InternetAddress.anyIPv4;
// 配置一个记录请求的日志管道。
final handler = Pipeline()
.addMiddleware(logRequests())
.addMiddleware(firebaseAuthMiddleware())
.addHandler(_router.call);
// 在容器中运行时,我们尊重PORT环境变量。
final port = int.parse(Platform.environment['PORT'] ?? '8080');
final server = await serve(handler, ip, port);
print('Server listening on port ${server.port}');
}
额外信息
验证令牌的方法基于Firebase文档中的描述,可以在这里找到。
更多关于Flutter身份验证插件firebase_verify_id_tokens的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter身份验证插件firebase_verify_id_tokens的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter项目中,使用firebase_verify_id_tokens
插件来验证Firebase ID令牌通常涉及以下几个步骤。虽然firebase_verify_id_tokens
不是Firebase官方直接提供的一个插件,但我们可以使用Firebase Admin SDK在服务器端验证ID令牌,然后通过Flutter应用与服务器进行交互。这里我将展示如何使用Flutter与Flutter的HTTP客户端库以及Firebase Admin SDK在服务器端验证ID令牌。
服务器端代码(Node.js + Firebase Admin SDK)
首先,在服务器端(例如使用Node.js),你需要设置Firebase Admin SDK来验证ID令牌。
- 安装Firebase Admin SDK
npm install firebase-admin
- 初始化Firebase Admin SDK
创建一个server.js
文件,并添加以下代码:
const admin = require('firebase-admin');
const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
// 初始化Firebase Admin SDK
admin.initializeApp({
credential: admin.credential.cert({
projectId: "YOUR_PROJECT_ID",
clientEmail: "YOUR_CLIENT_EMAIL",
privateKey: "-----BEGIN PRIVATE KEY-----\nYOUR_PRIVATE_KEY\n-----END PRIVATE KEY-----\n"
})
});
const app = express();
app.use(cors());
app.use(bodyParser.json());
app.post('/verify-token', async (req, res) => {
const { idToken } = req.body;
try {
const decodedToken = await admin.auth().verifyIdToken(idToken);
console.log('Verified ID Token:', decodedToken);
res.status(200).json({ message: 'Token verified successfully', data: decodedToken });
} catch (error) {
console.error('Error verifying ID Token:', error);
res.status(400).json({ message: 'Failed to verify token', error: error.message });
}
});
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
确保替换YOUR_PROJECT_ID
, YOUR_CLIENT_EMAIL
, 和 YOUR_PRIVATE_KEY
为你的Firebase项目信息。
Flutter客户端代码
在Flutter客户端,你可以使用http
包来向你的服务器发送POST请求,验证ID令牌。
- 添加依赖
在pubspec.yaml
文件中添加http
依赖:
dependencies:
flutter:
sdk: flutter
http: ^0.13.3 # 确保使用最新版本
- 验证ID令牌
创建一个Dart文件(例如auth_service.dart
),并添加以下代码:
import 'dart:convert';
import 'package:http/http.dart' as http;
class AuthService {
final String serverUrl = 'http://localhost:5000/verify-token'; // 替换为你的服务器URL
Future<Map<String, dynamic>> verifyIdToken(String idToken) async {
Map<String, String> body = {'idToken': idToken};
http.Response response = await http.post(
Uri.parse(serverUrl),
body: jsonEncode(body),
headers: <String, String>{
'Content-Type': 'application/json',
},
);
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else {
throw Exception('Failed to verify token: ${response.body}');
}
}
}
- 使用AuthService
在你的主文件(例如main.dart
)中,你可以这样使用AuthService
:
import 'package:flutter/material.dart';
import 'auth_service.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final AuthService _authService = AuthService();
String _result = '';
void _verifyToken() async {
String idToken = "YOUR_USER_ID_TOKEN"; // 替换为用户的ID令牌
try {
Map<String, dynamic> response = await _authService.verifyIdToken(idToken);
setState(() {
_result = 'Success: ${response['message']}\nData: ${response['data']}';
});
} catch (e) {
setState(() {
_result = 'Error: ${e.message}';
});
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Verify ID Token'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(_result),
SizedBox(height: 20),
ElevatedButton(
onPressed: _verifyToken,
child: Text('Verify Token'),
),
],
),
),
),
);
}
}
确保替换YOUR_USER_ID_TOKEN
为实际的用户ID令牌。
这样,你就完成了一个Flutter客户端与服务器端交互,使用Firebase Admin SDK验证ID令牌的完整流程。