无法执行云函数触发不允许未经身份验证的调用的 HTTP 触发的云函数?

2023-12-21

我遇到一种情况,我试图创建两个云功能,即 CF1 和 CF2,并且我有一个云调度程序。两个云功能都启用了经过身份验证的调用。我的流程是Cloud Scheduler将触发CF1。 CF1 完成后,CF1 将触发 CF2 作为 http 调用。我已经提到过无法从 GCP Scheduler 调用 Google Cloud Function https://stackoverflow.com/questions/60055422/cannot-invoke-google-cloud-function-from-gcp-scheduler从 Cloud Scheduler 访问经过身份验证的 CF1,并且能够访问 CF1。但从 CF1 访问 CF2 时遇到问题。 CF1 不会触发 CF2,也不会给出任何错误消息。当从另一个经过身份验证的云功能访问经过身份验证的云功能时,我们是否需要遵循任何其他技术。

CF1代码:

import json
import logging
from requests_futures.sessions import FuturesSession


def main(request):
    # To read parameter values from request (url arguments or Json body).
    raw_request_data = request.data
    string_request_data = raw_request_data.decode("utf-8")
    request_json: dict = json.loads(string_request_data)

    request_args = request.args

    if request_json and 'cf2_endpoint' in request_json:
        cf2_endpoint = request_json['cf2_endpoint']
    elif request_args and 'cf2_endpoint' in request_args:
        cf2_endpoint = request_args['cf2_endpoint']
    else:
        cf2_endpoint = 'Invalid endpoint for CF2'

    logger = logging.getLogger('test')
    try:
        session = FuturesSession()
        session.get("{}".format(cf2_endpoint))
        logger.info("First cloud function executed successfully.")

    except RuntimeError:
        logger.error("Exception occurred {}".format(RuntimeError))

CF2代码:

import logging

def main(request):
    logger = logging.getLogger('test')
    logger.info("second cloud function executed successfully.")

当前输出日志:

First cloud function executed successfully.

预期输出日志:

First cloud function executed successfully.
second cloud function executed successfully.

注意:如果我对这两个云功能使用未经身份验证的访问,则相同的流程有效。


这里发生了两件事:

  1. 你没有使用request-futures完全正确。由于请求是异步发出的,因此您需要在函数隐式返回之前阻止结果,否则它可能会在 HTTP 请求完成之前返回(尽管在本例中可能是这样):
session = FuturesSession()
future = session.get("{}".format(cf2_endpoint))
resp = future.result()  # Block on the request completing
  1. 您向第二个函数发出的请求实际上并不是经过身份验证的请求。默认情况下,不对来自云功能的出站请求进行身份验证。如果您查看上面的实际响应,您会看到:
>>> resp.status_code
403
>>> resp.content
b'\n<html><head>\n<meta http-equiv="content-type" content="text/html;charset=utf-8">\n<title>403 Forbidden</title>\n</head>\n<body text=#000000 bgcolor=#ffffff>\n<h1>Error: Forbidden</h1>\n<h2>Your client does not have permission to get URL <code>/function_two</code> from this server.</h2>\n<h2></h2>\n</body></html>\n'

您可以跳过很多环节来正确验证此请求,如文档中详述:https://cloud.google.com/functions/docs/secure/authentication#function-to-function https://cloud.google.com/functions/docs/securing/authenticating#function-to-function

但是,更好的选择是将第二个函数设为“后台”函数,并通过从第一个函数发布的 PubSub 消息来调用它:

from google.cloud import pubsub

publisher = pubsub.PublisherClient()
topic_name = 'projects/{project_id}/topics/{topic}'.format(
    project_id=<your project id>,
    topic='MY_TOPIC_NAME',  # Set this to something appropriate.
)

def function_one(request):
    message = b'My first message!'
    publisher.publish(topic_name, message)

def function_two(event, context):
    message = event['data'].decode('utf-8')
    print(message)

只要您的函数具有发布 PubSub 消息的权限,就可以避免向 HTTP 请求添加授权,并且还可以确保至少一次传递。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法执行云函数触发不允许未经身份验证的调用的 HTTP 触发的云函数? 的相关文章

  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • Antlr 解析器运算符优先级

    考虑以下语法 我对运算符优先级有疑问 例如 res 2 a b有一个类似的解析树res 2 a b 我知道问题出在哪里 但我没有想到没有相互左递归的 漂亮 解决方案 你能帮我一点忙吗 该语法与自定义访问者一起使用 grammar Math
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo
  • 带有 Maven Wrapper 的 Java 17 导致无法识别的 VM 选项“MaxPermSize=512m”

    I use OpenJDK 17 https jdk java net 17 使用 Maven Wrapper 3 8 2 从春季初始化 https start spring io Maven项目 JAR打包 Java 17 Spring
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2
  • Amazon RDS for SQL Server 是否支持 SSIS?

    从谷歌搜索中读到一些相互矛盾的答案 不确定答案是是 否还是可能 我觉得读的时候已经很清楚了this http docs aws amazon com AmazonRDS latest UserGuide CHAP SQLServer htm
  • NSArrayController 无需将大型数据集加载到数组中

    我想使用 NSArrayController 向 NSTableView 提供数据 我面临的问题是我不想将所有数据预先加载到数组中 然后使用数组控制器setContent 方法 我的数据模型是一个管理数百万条记录的大型现有代码库 它包含有效
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我
  • 如何在 OSX 上安装 LaTeX .sty 文件?

    我设置了一个 LaTeX 项目 tex documents some file tex support todonotes sty where some file tex uses todonotes usepackage colorinl
  • Android 材料芯片组件崩溃应用程序。无法膨胀 xml

    Tried Chip来自两个支持库的组件 com google android support design 28 0 0 rc01和材料 com google android material material 1 0 0 rc01 堆栈
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording
  • 探查器模板可以迁移到较新版本的 SQL Profiler 吗?

    是否可以将 Profiler 模板迁移到较新版本的 SQL Server 就我而言 我想将 SQL 2008 模板带到 2012 年 我尝试过 1 直接文件复制和 2 导出 导入 在这两种情况下 旧模板都会运行 但无法修改 修改后会出现以下

随机推荐

  • 通过关键参数保持视图路由器处于活动状态

    如何分别使用不同的参数使 vue router 保持活动状态 TL DR 让我们考虑一个开发 Facebook 等网站的例子 每个用户都有一个个人资料页面 因为有很多用户 我们不想迭代所有用户并在加载时加载所有个人资料页面 如下所示
  • 动态无锁内存分配器

    编写满足无锁进度保证的算法或数据结构的困难之一是动态内存分配 调用类似malloc or new不保证以便携方式无锁 然而 许多无锁实现malloc or new存在 并且还有各种可用于实现无锁算法 数据结构的无锁内存分配器 但是 我仍然不
  • android-检测低电量通知的方法

    有没有办法在 android eclipse 中检测低电量通知 我有一个动作游戏 当它出现时需要暂停 官方开发者网站上有一个关于监控电池电量和充电状态的教程 我希望它对你有帮助 http developer android com trai
  • 为什么当视图聚焦时 RecyclerView 会滚动到视图顶部

    I have RecyclerView 某种聊天 物品有TextViews布局颠倒了 下面的输入字段RecyclerView 当我滚动到底部时RecyclerView然后单击底部项目 它会获得焦点 仅当它获得焦点时 而不是每次单击时 并且R
  • PowerShell 2.0如何处理异常?

    为什么我在运行这两个简单示例时在控制台上打印错误消息 我希望我在控制台上打印 错误测试 而不是 Get WmiObject RPC 服务器是 不可用 HRESULT 的异常 0x800706BA 在行 3 字符 15 Get WmiObje
  • python-画一张愤怒和惊讶的脸

    我使用这段代码并尝试更改代码以获得愤怒和惊讶的表情 但我做不到 谁能帮我 import turtle smiles turtle Turtle smiles penup smiles goto 75 150 smiles pendown s
  • 循环动态 JSON 以获取所有节点 C#

    我有多个 JSON 文件 需要循环并从中获取某些详细信息 但是 我希望有一个一刀切的循环 因为子节点在属性方面彼此匹配 谁能建议我如何循环我的 JSON 节点 Example name Example description Example
  • 我如何获得文本所属的跨度类ID?

    HTML 内容可编辑的div div div int main span class openParen bm1 span span class closeParen bm1 span div div if span class openP
  • 从 axios 请求设置状态的最佳实践

    我有一个具有以下功能的 api js 文件 export const login loginUserName loginPassword setUser gt axios method post data username loginUse
  • 按钮的 Android 主题样式不适用

    我的主要活动视图中有三个简单的按钮 我想做的是将按钮样式应用于所有按钮 但我没有这样做 这是我的 xml
  • 根据当月操作上月数据

    我有一个名为 Prv Data 的表 其中包含上个月的报告 具有 Report Id 和 Timeline 列 Prv Data gt Report ID Timeline 01 Weekly Mon 01 Weekly Mon 01 We
  • 如果字符串包含单引号或双引号,则调用 CMIS 查询时出错

    这是我的问题 当我尝试在 CMIS 查询中传递包含单引号或双引号的查询字符串时 它不会执行并给出如下错误 06 19 23 306 ERROR DispatcherPortlet 561 Could not complete request
  • catkin_make后找不到ROS包

    我根据 ROS 的 Wiki 页面创建了一个 ROS 工作区 我还使用创建了一个包catkin create pkg在我刚刚创建的工作区下 然后 按照 ROS Wiki 中的步骤使用以下命令构建包catkin make 构建包后 我插入命令
  • 关于reactjs,preventDefault 与 return false

    我今天开始学习React Js 发现一个有趣的事实 并且没有找到任何相关主题 我们必须使用它preventDefault比使用return false防止默认行为的语句 https reactjs org docs handling eve
  • 无法使用 HeidiSQL 连接到 LocalDB

    我一直在尝试使用最新版本 此时 的 heidisql 连接到 localdb 实例 但无济于事 我已按照此答案中的说明进行操作 但它似乎不起作用 不再 HeidiSql 与 MS SQL Server LocalDB 的连接 https s
  • 是否可以在 Silverlight Web 应用程序和 Windows Phone 7 应用程序之间共享代码

    我有一个简单的 Silverlight 应用程序 我希望它几乎按原样在 Windows Phone 7 上运行 我创建了一个新的 Windows Phone 7 项目 当我引用 Silverlight 应用程序时 我收到一条警告 添加对 S
  • captureVisibleTab 不可见选项卡

    是否可以使用 Chrome 扩展 API 截取不可见选项卡的屏幕截图 chrome tabs captureVisibleTab仅使用特定窗口上选定的选项卡 我可以通过编程方式切换到所需的选项卡 截取屏幕截图并切换回来 但由于它都是异步的
  • Asp.Net Core中间件路径字符串startswithsegments问题

    有一个 Asp NET Core 2 0 应用程序 我想映射任何不以 api重新执行到根路径 我添加了以下内容 但似乎不起作用 app MapWhen c gt c Request Path StartsWithSegments api S
  • 即使包不可用,TextToSpeech.setEngineByPackageName() 也会返回成功

    在设法使 TextToSpeech setEngineByPackageName 工作之后 感谢这个答案 https stackoverflow com a 9476122 636571 我现在遇到 相反 的问题 tts setEngine
  • 无法执行云函数触发不允许未经身份验证的调用的 HTTP 触发的云函数?

    我遇到一种情况 我试图创建两个云功能 即 CF1 和 CF2 并且我有一个云调度程序 两个云功能都启用了经过身份验证的调用 我的流程是Cloud Scheduler将触发CF1 CF1 完成后 CF1 将触发 CF2 作为 http 调用