我在运行graphql的Cloud Run服务器中使用Firebase管理员身份验证作为身份验证和授权机制(客户端发送令牌,服务器将验证并检查自定义声明中包含的用户角色)。每当尝试调用verifyIdToken时,admin auth模块都会引发错误。从云功能调用admin auth方法虽然可以正常工作。
FirebaseAuthError:必须使用证书凭据初始化应用,或将您的Firebase项目ID设置为GOOGLE_CLOUD_PROJECT环境变量,以调用verifyIdToken()。
我尝试使用App Engine服务帐户(与云功能所使用的帐户相同),并以Firebase管理员角色创建新的帐户,作为我的云运行服务帐户,但无济于事。我可以通过在Dockerfile中提供凭据文件(从firebase控制台生成)来运行它,并设置env变量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')
}
};
不是同一服务帐户应该能够访问管理员身份验证资源吗?