有一种简单的方法可以拒绝(在代码中)所有不是来自我的 firebase v2 函数的 Cloud Tasks 的请求。
export const createSomethingHttp = onRequest(async (request, response) => { // Check if the request is from Cloud Tasks if (!request.headers['x-cloudtasks-queuename']) { logger.error('Request not from Cloud Tasks', request.headers); response.status(403).json({ error: 'Forbidden' }); return; }
目前,这是我的守卫,但如果可以轻松绕过。
有没有办法修改此代码来验证请求的来源? 功能和云任务位于同一项目和同一位置。
非常感谢
我在网上找到了一些关于OIDC代币的答案,但我无法正确理解它,我认为是因为缺乏经验和专业知识,尤其是不同编码语言的答案。我认为这还需要对 GCP 帐户/服务帐户进行一些更改。我正在寻找是否有来自代码端的方法。
为了给您提供更安全的模式来确保您的 Firebase 函数仅接受来自 Google Cloud 任务的请求,您可以使用 OIDC 令牌进一步增强验证。这比仅仅检查标头是否存在更安全。
更改代码:
第 1 步:设置身份验证 启用身份验证:确保在您的 Google Cloud 项目中启用必要的 API。其中应该包括 Cloud Tasks API。 服务帐户:创建云任务将用来调用云功能的服务帐户。应授予其 Cloud Functions Invoker 角色。
第 2 步:更新您的 Firebase 函数 您应该使用 google-auth-library 并在 Firebase 函数中验证 OIDC 令牌。如何做到这一点如下所示。
const { onRequest } = require('firebase-functions/v2');
const { auth } = require('google-auth-library');
const client = new auth.GoogleAuth({
scopes: 'https://www.googleapis.com/auth/cloud-platform',
});
export const createSomethingHttp = onRequest(async (request, response) => {
const token = request.headers['authorization']?.split('Bearer ')[1];
if (!token) {
response.status(403).json({ error: 'Forbidden: No token provided' });
return;
}
try {
// Verify the token
const ticket = await client.verifyIdToken({
idToken: token,
audience: '<YOUR_CLOUD_FUNCTION_URL>', // Specify your Cloud Function URL
});
// You can also check the issuer
const payload = ticket.getPayload();
if (payload.aud !== '<YOUR_CLOUD_FUNCTION_URL>') {
response.status(403).json({ error: 'Forbidden: Invalid token' });
return;
}
// Proceed with your function logic
response.status(200).json({ message: 'Request from Cloud Tasks accepted' });
} catch (error) {
console.error('Error verifying token:', error);
response.status(403).json({ error: 'Forbidden: Invalid token' });
}
});