在云运行容器中使用Firebase Admin Auth

在云运行容器中使用Firebase Admin Auth,firebase,firebase-authentication,firebase-admin,google-cloud-run,Firebase,Firebase Authentication,Firebase Admin,Google Cloud Run,我在运行graphql服务器的云运行中使用Firebase admin auth作为身份验证和授权机制(客户端发送令牌,服务器将验证和检查自定义声明中包含的用户角色)。admin auth模块在尝试调用verifyIdToken时将抛出错误。不过,从云函数调用admin auth方法可以完美地工作 FirebaseAuthError:必须使用证书凭据初始化应用程序,或将Firebase项目ID设置为GOOGLE_CLOUD_项目环境变量以调用verifyIdToken() 我曾尝试使用app e

我在运行graphql服务器的云运行中使用Firebase admin auth作为身份验证和授权机制(客户端发送令牌,服务器将验证和检查自定义声明中包含的用户角色)。admin auth模块在尝试调用verifyIdToken时将抛出错误。不过,从云函数调用admin auth方法可以完美地工作

FirebaseAuthError:必须使用证书凭据初始化应用程序,或将Firebase项目ID设置为GOOGLE_CLOUD_项目环境变量以调用verifyIdToken()

我曾尝试使用app engine服务帐户(与云功能使用的帐户相同),并使用firebase admin角色创建了一个新帐户作为我的云运行服务帐户,但没有成功。我可以通过在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;
  }
};

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

糟糕,错误消息说明了一切,我需要在CLOUD run env vars中提供GOOGLE_CLOUD_项目。

在CLOUD run中添加GOOGLE_CLOUD_项目作为环境变量也解决了我的问题。

我可以吻你。我花了一整天找这个。问题是我没有提到任何关于
GOOGLE\u CLOUD\u项目
环境变量的错误。我刚刚得到
必须使用项目ID初始化FirebaseApp才能调用verifyIdToken()
。尽管如此,在CLOUD run中添加
GoogleCloud\u项目作为环境变量解决了这个问题。
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')
  }
};