如何在 Google Cloud Functions 的 python 环境中检查 HTTP 基本身份验证

Posted

技术标签:

【中文标题】如何在 Google Cloud Functions 的 python 环境中检查 HTTP 基本身份验证【英文标题】:How to check HTTP basic auth on the python environment of Google Cloud Functions 【发布时间】:2019-04-19 10:50:51 【问题描述】:

如何实现?

我不确定是否可以使用各种 Flask 相关库,因为它们使用 python 装饰器 - 而且我无权访问 Flask 路由。

我的解决方案是手动获取标头,并手动解析授权字符串。但我实际上不确定Authorization 遵循什么格式 - 是否有一些库可以为我处理这种复杂情况?

【问题讨论】:

【参考方案1】:

云函数 (CF) 主要用于执行简单的独立任务,而不是复杂的应用程序。

推荐的CF访问控制方法基于service accounts和IAM。来自Runtime service account:

在运行时,Cloud Functions 使用服务帐号 PROJECT_ID@appspot.gserviceaccount.com,具有编辑器 在项目中的作用。您可以更改此服务帐号的角色 限制或扩展您正在运行的函数的权限。

此访问控制方法在实际 CF 执行之外强制执行,因此您无需担心 CF 代码中的身份验证 - 您已经知道它只能使用相应的服务帐户凭据执行。

是的,可能可以使用类似于在更复杂的应用程序中使用的自定义身份验证方案,但这不是微不足道的 - 这不是 CF 的设计目的.请参阅某种相关的When to choose App Engine over Cloud Functions?

【讨论】:

网址是公开的 - 不确定服务帐户如何以这种方式提供任何身份验证。 啊,你的意思是在入口端。我想 IAM 检查 cloudfunctions.functions.call 权限是在 CF 触发级别完成的。因此,如果触发器是 HTTP,是的,该 URL 是公共的,但它位于 Google 拥有的 cloudfunctions.net 域中,因此在接收到 HTTP 请求后但在实际调用 CF 之前进行 IAM 检查很容易。因此,您实际上不需要在 CF 代码本身内部做任何事情,您只需要注意配置 CF 和 IAM 角色和权限。 我还是不明白为什么这和HTTP的“基本访问认证”有关系? 我想我想说的是,我认为尝试解析/使用 CF 代码中的基本身份验证信息毫无意义。由于特定的 CF 始终在 Google 策划的环境中由相同的身份/用户执行,因此信息要么丢失要么是静态的。 它在 HTTP 请求中作为 HTTP 标头发送 - 因此我可以检查它是否与用户名和密码匹配。【参考方案2】:

requirements.txt:

basicauth==0.4.1

还有代码:

from basicauth import decode


encoded_str = request.headers.get('Authorization')
username, password = decode(encoded_str)

if (username == "example", password == "*********"):
    authed_request = True

【讨论】:

以上是关于如何在 Google Cloud Functions 的 python 环境中检查 HTTP 基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中运行 Google Cloud Function 中的子进程

如何修改后台 Cloud Function 的 Google Cloud Pub/Sub 订阅确认截止日期

如何从 Firebase Cloud Function 在 Google Pub/Sub 中发布消息?

如何解决 Google Cloud Function 上的“No module named 'frontend'”错误消息

如何从Google Cloud Function(Cheerio,Node.js)发出多个http请求

在 Google Cloud Function 中设置环境变量