【发布时间】:2020-01-25 13:21:51
【问题描述】:
我在运行 graphql 服务器的 Cloud Run 中使用 Firebase 管理员身份验证作为身份验证和授权机制(客户端发送令牌,服务器将验证并检查自定义声明中包含的用户角色)。每当尝试调用 verifyIdToken 时,admin auth 模块都会抛出错误。但是,从云函数调用管理员身份验证方法可以完美地工作。
FirebaseAuthError:必须使用证书凭据初始化应用或将您的 Firebase 项目 ID 设置为 GOOGLE_CLOUD_PROJECT 环境变量以调用 verifyIdToken()。
我尝试使用应用引擎服务帐户(与云功能使用的帐户相同)并创建一个具有 firebase 管理员角色的新帐户作为我的云运行服务帐户,但无济于事。我可以通过在我的 Dockerfile 中提供凭据文件(从 firebase 控制台生成)并设置环境变量 GOOGLE_APPLICATION_CREDENTIALS 来使其运行,但我想将其用作最后的手段,因为它非常难看。
下面是我的 Apollo 服务器的上下文函数
import { Context, ContextFunction } from 'apollo-server-core';
import { ExpressContext } from 'apollo-server-express/dist/ApolloServer';
import { firebase } from '../config';
import { batchLoaders } from './batchLoaders';
export const context: ContextFunction<ExpressContext, Context> = async ({
req
}) => {
const token = req.headers.authorization || '';
const defaultContext = { batchLoaders };
if (token.length === 0) return defaultContext;
try {
const { uid } = await firebase.auth.verifyIdToken(token);
const user = await firebase.auth.getUser(uid);
return { uid, claims: user.customClaims, ...defaultContext };
} catch (err) {
console.error(err);
return defaultContext;
}
};
以及从中导入 firebase 模块的文件。
const firebaseApp = initializeApp();
const auth = firebaseApp.auth();
const firestore = firebaseApp.firestore();
export const firebase = {
auth,
firestore,
refs: {
events: firestore.collection('_events'),
versions: firestore.collection('_versions')
}
};
不是同一个服务帐户应该能够访问管理员身份验证资源吗?
【问题讨论】:
标签: firebase firebase-authentication firebase-admin google-cloud-run