使用Firebase 1.0新SDK通过云函数生成自定义认证令牌
解决Firebase Admin初始化及自定义令牌生成的升级问题
嘿,我之前升级Firebase Functions和Admin SDK的时候也踩过这个坑,给你理清楚正确的做法:
首先要明确:从firebase-admin@5.11.0和firebase-functions@1.0.0开始,在Cloud Functions运行环境中,你完全不需要手动传入凭证或应用配置给initializeApp。Firebase会自动通过运行时环境注入项目的服务账号凭证和基础配置,你只需要调用无参数的admin.initializeApp()就能完成初始化。
关于自定义令牌生成的变化
你之前通过手动生成凭证传入initializeApp的方式,现在完全不需要了。默认注入的服务账号已经拥有生成自定义令牌的权限,直接使用初始化后的admin.auth().createCustomToken()方法即可,逻辑和之前基本一致。
要不要修改process.env.FIREBASE_CONFIG?
答案是不需要。这个环境变量是Firebase自动设置的,里面包含项目的基础配置(比如项目ID、存储桶地址等),但服务账号凭证是运行时自动加载的,不需要你手动序列化后放入这个变量中。手动修改反而可能导致初始化出错。
新旧代码对比参考
旧版本写法(升级前)
const admin = require('firebase-admin'); const functions = require('firebase-functions'); const serviceAccount = require('./service-account.json'); // 手动传入凭证和配置 admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: "https://your-project.firebaseio.com" }); exports.createCustomToken = functions.https.onCall((data, context) => { const uid = data.uid; return admin.auth().createCustomToken(uid) .then(token => ({ token })) .catch(err => { throw new functions.https.HttpsError('internal', '生成令牌失败', err); }); });
新版本写法(升级后)
const admin = require('firebase-admin'); const functions = require('firebase-functions'); // 直接无参数初始化 admin.initializeApp(); exports.createCustomToken = functions.https.onCall((data, context) => { const uid = data.uid; if (!uid) { throw new functions.https.HttpsError('invalid-argument', '必须提供UID'); } return admin.auth().createCustomToken(uid) .then(token => ({ token })) .catch(err => { throw new functions.https.HttpsError('internal', '生成令牌失败', err); }); });
本地开发注意事项
如果你在本地测试Cloud Functions,只需要确保已经通过firebase login登录账号,并且使用firebase serve启动本地服务即可——Firebase CLI会自动帮你配置好所需的环境变量和凭证,不需要额外操作。
内容的提问来源于stack exchange,提问作者Murphy Randle
相关产品推荐
相关产品推荐

