我在同一个GCP项目上有2个Google Cloud Function 1 Gen,R和C.

R是一个私有函数,其"只允许内部流量"标志设置为真.在权限选项卡中,我将调用者角色分配给服务帐户SA.

C是一个公共函数,它将所有出口流量重定向到无服务器VCP连接器.

不出所料,如果我try 从浏览器调用R,我会收到404Not Found错误.

在他的代码中,C使用SA json密钥(保存在秘密管理器上)来获取身份验证令牌,然后向R发出HTTP请求,使用检索到的持有者令牌设置身份验证头.

这里是R代码:

def hello_world(request):
  return f'Hello World!'

下面是C代码:

import requests
import functions_framework
import google.auth
import google.auth.transport.requests
from flask import Request
from typing import Tuple

from google.oauth2 import service_account
import os, json


def get_token() -> str:
    service_account_key = json.loads(os.getenv('SA'))
    credentials = service_account.Credentials.from_service_account_info(
        service_account_key,  
        scopes=['https://www.googleapis.com/auth/cloud-platform']  
    )
    auth_req = google.auth.transport.requests.Request()
    credentials.refresh(auth_req)
    return credentials.token


@functions_framework.http
def test(req: Request) -> Tuple[str, int]:
    url = "..."
    headers = {
        "Authentication": f"Bearer {get_token()}"
    }
    response = requests.get(url, headers=headers)
    return response.text, response.status_code

我希望C可以调用R,但我收到了403禁止错误.

C调用R的唯一方法是将R公之于众(我已经try 过了,而且很有效).

这就是例外行为吗?我错过了什么吗?

推荐答案

您必须使用身份令牌而非访问令牌来调用云函数.在这里,您使用访问令牌.

此外,不要使用存储在秘密管理器中的服务帐户密钥文件、事件,这是完全无用的,并且会增加您的安全风险.


下面是生成身份令牌的代码示例

import google.oauth2.id_token
import google.auth.transport.requests

request = google.auth.transport.requests.Request()
target_audience = "my_cloud_function_url"

id_token = google.oauth2.id_token.fetch_id_token(request, target_audience)
print(id_token)

Python-3.x相关问答推荐

math. gcd背后的算法是什么,为什么它是更快的欧几里得算法?

使用数据库将文件从Sharepoint下载到文件系统

我正在try 从 10*3 矩阵中删除随机值并将其变为 10*2 矩阵

将列表转换为 pandas 数据框,其中列表包含字典

Django 模型类方法使用错误的 `self`

从 https://www.niftytrader.in/stock-options-chart/sbin 提取 SBIN 股票最大痛苦值的 Python 代码不起作用 - 我错过了什么?

生成具有偶数个 0 和 1 的给定长度的所有二进制数

平移数组

Pandas:从 Pandas 数据框中的 1 和 0 模式中获取值和 ID 的计数

避免重复连续字符但不包括一个特定字符的正则表达式

在字符串中查找正则表达式的所有模式

Dask worker post-processing

使用一周的特定第一天将每日日期转换为每周

在 Python 3 中使用 unittest.mock 修补 input()

Pandas 的 EMA 与股票的 EMA 不匹配?

定义 True,如果没有定义,会导致语法错误

在没有时间的python中创建日期

是否在未完成初始化的对象上调用了 del?

Python - 类 __hash__ 方法和集合

如何阻止散景在 Jupyter Notebook 中打开新标签?