Security 使用auth保护Google云功能http触发器
我今天将按照以下指南试用Google云功能: 我创建了一个带有HTTP触发器的函数,并且能够执行POST请求来触发函数写入数据存储 我想知道是否有办法保护这个HTTP端点?目前,它似乎会接受来自任何地方/任何人的请求 在谷歌上搜索时,我看到大多数结果都在谈论如何使用Firebase确保安全。但是,我在这里不使用Firebase服务Security 使用auth保护Google云功能http触发器,security,authentication,google-cloud-datastore,google-cloud-functions,Security,Authentication,Google Cloud Datastore,Google Cloud Functions,我今天将按照以下指南试用Google云功能: 我创建了一个带有HTTP触发器的函数,并且能够执行POST请求来触发函数写入数据存储 我想知道是否有办法保护这个HTTP端点?目前,它似乎会接受来自任何地方/任何人的请求 在谷歌上搜索时,我看到大多数结果都在谈论如何使用Firebase确保安全。但是,我在这里不使用Firebase服务 我的选择是要么让它打开,希望没有人知道URL端点(保密),要么在函数本身中实现我自己的身份验证?目前似乎有两种方法来保护Google云函数HTTP端点 1) 使用难以
我的选择是要么让它打开,希望没有人知道URL端点(保密),要么在函数本身中实现我自己的身份验证?目前似乎有两种方法来保护Google云函数HTTP端点
1) 使用难以猜测的函数名(例如:my-function-vrf55m6f5Dvkrerytf35) 2) 检查函数本身中的密码/凭据/签名请求(使用头或参数)
可能最好两者都做。在进一步研究这一点并从@ricka的回答中得到一个提示后,我决定使用以授权头访问令牌的形式传入的JWT令牌为我的云函数实现身份验证检查 以下是节点中的实现:
const client = jwksClient({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: "https://<auth0-account>.auth0.com/.well-known/jwks.json"
});
function verifyToken(token, cb) {
let decodedToken;
try {
decodedToken = jwt.decode(token, {complete: true});
} catch (e) {
console.error(e);
cb(e);
return;
}
client.getSigningKey(decodedToken.header.kid, function (err, key) {
if (err) {
console.error(err);
cb(err);
return;
}
const signingKey = key.publicKey || key.rsaPublicKey;
jwt.verify(token, signingKey, function (err, decoded) {
if (err) {
console.error(err);
cb(err);
return
}
console.log(decoded);
cb(null, decoded);
});
});
}
function checkAuth (fn) {
return function (req, res) {
if (!req.headers || !req.headers.authorization) {
res.status(401).send('No authorization token found.');
return;
}
const parts = req.headers.authorization.split(' ');
if (parts.length != 2) {
res.status(401).send('Bad credential format.');
return;
}
const scheme = parts[0];
const credentials = parts[1];
if (!/^Bearer$/i.test(scheme)) {
res.status(401).send('Bad credential format.');
return;
}
verifyToken(credentials, function (err) {
if (err) {
res.status(401).send('Invalid token');
return;
}
fn(req, res);
});
};
}
您可以在我的github回购上看到此更改,网址为
JWT/access令牌可以通过多种方式检索。对于Auth0,可以在以下位置找到API文档:
一旦这一切就绪,您就可以使用以下命令触发云函数(如果您的函数已启用http触发器)
curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer access-token" \
-d '{"foo": "bar"}' \
"https://<cloud-function-endpoint>.cloudfunctions.net/get"
curl-xpost-H“内容类型:application/json”\
-H“授权:承载访问令牌”\
-d'{“foo”:“bar”}\
"https://.cloudfunctions.net/get"
你不应该“把它打开,希望没人知道”。您可以实施自己的安全检查,也可以尝试使用Google Function Authorizer module()。您可以创建自定义身份验证算法来验证客户端
从中检查算法 您可以在函数外部设置项目范围或每个函数的权限,以便只有经过身份验证的用户才能触发函数,即使他们试图攻击端点
以下是关于和的Google云平台文档。请注意,在撰写本文时,我认为使用此方法需要用户使用Google帐户进行身份验证 三年后,我花了一天时间为同一个问题烦恼,而谷歌的文档是呃,不是很能说明问题。对于那些不想在代码(me)中实现这一点的人,我将在下面概述如何仅使用GCP控制台对云函数进行身份验证。下面是一个将HTTP触发器验证为新服务帐户的示例,该帐户随后计划在Cloud Scheduler中运行。您可以进一步扩展和概括它,以满足其他需求 假设: 1.您已经创建了一个使用HTTP的云函数,并使其需要身份验证。 2.当您进行测试运行时,您的函数工作。这一点很重要,您不希望在以后同时解决两个或多个问题。 3.您知道如何绕过GCP Web浏览器控制台 步骤
对于“Auth Header”,选择OIDC令牌。这些令牌由GCP为您的项目管理,足以进行身份验证。
对于“服务帐户”,请按上述步骤粘贴相同的帐户。
“观众”将自动填充,无需放置任何内容。 完成后,根据您的入口点单击“更新”或“保存”。
curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer access-token" \
-d '{"foo": "bar"}' \
"https://<cloud-function-endpoint>.cloudfunctions.net/get"