如何使用 Firebase 身份验证模拟器中存储的用户在函数模拟器中对 Firebase 云函数进行身份验证?

Nar*_*esh 5 firebase-tools firebase-authentication google-cloud-functions

我的 firebase 云函数包含受保护的路由,只有在请求标头中传递有效的 IdToken 时才能访问这些路由。云函数 API 看起来像这样

functions/index.js


const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  databaseURL: "DB_URL"
});

const express = require('express');
const app = express();


const authenticate = async (req, res, next) => {
  if (!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) {
    res.status(403).send('Unauthorized');
    return;
  }
  const idToken = req.headers.authorization.split('Bearer ')[1];
  try {
    const decodedIdToken = await admin.auth().verifyIdToken(idToken);
    req.user = decodedIdToken;
    next();
    return;
  } catch(e) {
    res.status(403).send('Unauthorized');
    return;
  }
};

app.use(authenticate);


app.get('/protected', async (req, res) => {
    return res.send('OK');
});

exports.api = functions.https.onRequest(app);
Run Code Online (Sandbox Code Playgroud)

最初,我使用 Firebase 身份验证来创建新用户并获取 IdToken

创建新用户

curl 'https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=[API_KEY]' \
-H 'Content-Type: application/json' \
--data-binary '{"email":"[user@example.com]","password":"[PASSWORD]","returnSecureToken":true}'
Run Code Online (Sandbox Code Playgroud)

获取 IdToken,以便我可以将其传递给 firebase 云函数来访问受保护的路由

curl 'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=[API_KEY]' \
-H 'Content-Type: application/json' \
--data-binary '{"email":"[user@example.com]","password":"[PASSWORD]","returnSecureToken":true}'
Run Code Online (Sandbox Code Playgroud)

使用这种方法调用我的受保护的云函数运行良好

curl --location --request GET 'http://localhost:5001/abc-production/us-central1/api/protected/' \
--header 'Authorization: Bearer SECRET_ID_TOKEN'
Run Code Online (Sandbox Code Playgroud)

现在,我不想使用 Firebase 身份验证,而是使用身份验证模拟器来创建新用户并生成 IdToken。

UI 身份验证模拟器

我可以使用 Auth 模拟器 UI 创建新用户,但如何生成这些用户的访问令牌?是否有任何 API 端点可以返回本地保存的用户的 IdToken,以便我可以测试受保护的 API,而无需在生产中添加用户?

另外,当我运行身份验证模拟器时,使用生产 Firebase 身份验证环境生成的 IdToken 不起作用。

"code": "auth/argument-error",
        "message": "Firebase ID token has invalid signature. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token."
Run Code Online (Sandbox Code Playgroud)

Met*_*awi 0

该模拟器仅用于本地测试,不适用于生产,并且您不能使用模拟器颁发的 IdToken 来访问 Firebase Functions 等其他服务,因为正如文档所述

出于安全原因,身份验证模拟器会发出未签名的 ID 令牌,当在 Cloud Functions 模拟器内运行时,这些令牌仅被 Firebase Admin SDK 的 verifyIdToken 和 createSessionCookie 接受。

因此,这些令牌仅在模拟器环境中有效,如果您想将它们与 Firebase Function 一起使用,则只能使用 Functions 模拟器来实现。查看本指南以了解如何在本地运行这些功能。