在Cloud Run Container中使用Firebase Admin Auth

时间:2019-09-25 10:59:54

标签: firebase firebase-authentication firebase-admin google-cloud-run

我在运行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')
  }
};

不是同一服务帐户应该能够访问管理员身份验证资源吗?

2 个答案:

答案 0 :(得分:2)

糟糕,错误消息说明了一切,我需要在运行env vars的云中提供GOOGLE_CLOUD_PROJECT。

答案 1 :(得分:0)

将GOOGLE_CLOUD_PROJECT添加为云运行环境变量也解决了我的问题enter image description here