Flutter身份验证插件firebase_verify_id_tokens的使用

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

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

1 回复

更多关于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令牌。

  1. 安装Firebase Admin SDK
npm install firebase-admin
  1. 初始化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令牌。

  1. 添加依赖

pubspec.yaml文件中添加http依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 确保使用最新版本
  1. 验证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}');
    }
  }
}
  1. 使用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令牌的完整流程。

回到顶部