Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 使用auth保护Google云功能http触发器_Security_Authentication_Google Cloud Datastore_Google Cloud Functions - Fatal编程技术网

Security 使用auth保护Google云功能http触发器

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) 使用难以

我今天将按照以下指南试用Google云功能:

我创建了一个带有HTTP触发器的函数,并且能够执行POST请求来触发函数写入数据存储

我想知道是否有办法保护这个HTTP端点?目前,它似乎会接受来自任何地方/任何人的请求

在谷歌上搜索时,我看到大多数结果都在谈论如何使用Firebase确保安全。但是,我在这里不使用Firebase服务


我的选择是要么让它打开,希望没有人知道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浏览器控制台

步骤

  • 我建议创建一个新的服务帐户,用于调用HTTP云函数的任务。通过GCP的“IAM和管理”页面执行此操作。转到“服务帐户”,然后单击“新建”

  • 命名您的新服务帐户。服务帐户ID将根据您的姓名自动生成。它看起来像GCP服务帐户电子邮件。“@yourproject-name.iam.gserviceaccount.com。请稍后复制此内容。单击“创建”按钮以完成新帐户的创建

  • 在下一页,您需要为服务帐户选择一个角色。只运行函数的最佳实践是“云函数调用器”。单击“继续”按钮。您可以跳过第三部分。(授予用户访问此服务帐户的权限)

  • 现在,让我们将此新服务帐户添加到需要保护的云功能中。转到云功能面板,选中该功能名称左侧的框。然后在同一面板的右上角,单击“显示信息面板”-注意屏幕中需要验证。(您必须从此处添加,而不是从“权限”页面添加功能-您不能从此处添加新成员。)

  • >P>现在将服务帐户添加为一个新成员。将您先前复制的服务帐户电子邮件粘贴到红色框中的空白字段中。您必须放入电子邮件帐户,仅此名称将无法工作。对于“角色”-在下拉中,再次选择“云函数调用程序”。单击“保存”。

  • 在云函数的属性中有提供的HTTP触发器,请复制您的触发器,并将其保存在手边以备将来使用。

  • 现在转到Google Cloud Scheduler并选择一个计划。(如果您还没有计划,也可以创建一个。下面的屏幕显示一个已经制定的计划。)

  • 选中计划框后,单击“编辑”,您将看到下面的屏幕。选择初始屏幕底部的“显示更多”以查看所有字段。有关权限的重要字段:

  • 对于“URL”-粘贴在步骤6中复制的触发器URL中。
    对于“Auth Header”,选择OIDC令牌。这些令牌由GCP为您的项目管理,足以进行身份验证。
    对于“服务帐户”,请按上述步骤粘贴相同的帐户。
    “观众”将自动填充,无需放置任何内容。 完成后,根据您的入口点单击“更新”或“保存”。

  • 回到Cloud Scheduler仪表板,单击“立即运行”按钮来运行您的功能。如果一切正常,它应该运行,并显示状态“成功”。如果没有,请检查日志以查看发生了什么。

  • 现在,您知道您的已验证云功能与为其创建的服务帐户一起工作
    curl -X POST -H "Content-Type: application/json" \
    -H "Authorization: Bearer access-token" \
    -d '{"foo": "bar"}' \
    "https://<cloud-function-endpoint>.cloudfunctions.net/get"