一种简单的方法是拒绝(在代码中)所有不是来自 Cloud Tasks 的请求,适用于我的 firebase v2 function.export const createSomethingHttp = onRequest(async (request, response) => { ...
一个简单的方法来拒绝(在代码中)所有不是来自 Cloud Tasks 的针对我的 firebase v2 功能的请求。
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 Tasks 的请求,您可以使用 OIDC 令牌进一步增强验证。这比仅仅检查标头是否存在更安全。
更改的代码:
步骤 1:设置身份验证启用身份验证:确保在您的 Google Cloud 项目中启用了必要的 API。其中应该是 Cloud Tasks API。服务帐户:创建一个服务帐户,Cloud Tasks 将使用该帐户来调用 Cloud 函数。应授予此帐户 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' });
}
});