You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Python客户端应用认证以访问受限Google Cloud函数?

嗨,我来帮你搞定这个云函数认证的问题!你遇到的invalid_scope错误其实是因为调用云函数时用错了OAuth权限范围,而且生成令牌的方式得贴合云函数的要求。下面一步步给你解决:

1. 先搞对OAuth权限范围(Scope)

调用启用身份验证的Google Cloud Function,必须用正确的scope——https://www.googleapis.com/auth/cloud-platform(这个是通用的云平台权限,足够调用云函数),或者更细粒度的https://www.googleapis.com/auth/cloudfunctions。你之前的错误就是因为用了不符合要求的scope导致的,这个是核心问题之一。

2. 用官方库生成令牌并发起请求

推荐直接用Google官方的google-auth系列库来处理认证,手动造令牌很容易出错,官方库已经帮我们封装好了所有逻辑。

首先先装依赖:

pip install google-auth google-auth-httplib2 requests

然后给你写个可用的代码示例,两种加载服务账号密钥的方式都给你写上了(你可以选适合自己的):

import google.auth
from google.auth.transport.requests import Request
from google.oauth2.service_account import Credentials
import requests
import json

# 方式1:加载本地的服务账号密钥文件
# SERVICE_ACCOUNT_KEY_PATH = "path/to/your/service-account-key.json"

# 方式2:直接用你提供的脱敏JSON字符串(记得替换回真实内容)
service_account_info = json.loads('{"type": "service_account", "project_id": "XYZ", "private_key_id": "XYZ", "private_key": "XYZ", "client_email": "XYZ", "client_id": "XYZ", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "XYZ"}')

# 正确的权限范围
SCOPES = ["https://www.googleapis.com/auth/cloud-platform"]
# 替换成你的云函数实际URL
FUNCTION_URL = "https://your-region-your-project-id.cloudfunctions.net/your-function-name"

def invoke_authenticated_cloud_function():
    # 加载服务账号凭证(二选一)
    # credentials = Credentials.from_service_account_file(SERVICE_ACCOUNT_KEY_PATH, scopes=SCOPES)
    credentials = Credentials.from_service_account_info(service_account_info, scopes=SCOPES)

    # 刷新凭证获取有效的访问令牌
    credentials.refresh(Request())

    # 构建带认证的请求头
    headers = {
        "Authorization": f"Bearer {credentials.token}"
    }

    # 根据你的云函数需求选择GET/POST,这里以POST传JSON为例
    response = requests.post(FUNCTION_URL, headers=headers, json={"test_key": "test_value"})
    # 如果是GET请求就改成:
    # response = requests.get(FUNCTION_URL, headers=headers)

    # 处理响应结果
    if response.status_code == 200:
        print("云函数调用成功!响应内容:", response.json())
    else:
        print(f"调用失败,状态码:{response.status_code},错误信息:{response.text}")

if __name__ == "__main__":
    invoke_authenticated_cloud_function()
3. 再检查下服务账号的权限配置

你说已经给服务账号加了"Cloud Functions Invoker"角色,但还是要确认几点:

  • 这个角色是直接绑定在目标云函数资源上的,而不是只加在项目级别?(当然项目级别也能用,但绑定到具体函数更安全)
  • 服务账号的邮箱有没有写错?比如复制的时候多了空格或者少了字符?
  • 确认云函数的身份验证设置是"需要身份验证",别不小心开了允许未验证调用(不过你说之前未验证能访问,现在启用了不行,这点应该没问题,但还是核对下)
4. 为啥默认认证方案没生效?

你提到用环境变量和默认认证没起效,大概率是这两个原因:

  • 环境变量GOOGLE_APPLICATION_CREDENTIALS没设置对,或者你的Python脚本没读到这个变量(比如在IDE里运行时,得手动在IDE的环境变量设置里加上,不是只在终端设)
  • 你的本地环境有其他Google认证凭证(比如你自己的Google账号登录了gcloud),默认认证会优先用那些凭证,而不是你想指定的服务账号。用上面的代码手动加载密钥就能避开这个问题,确保用的是正确的服务账号。

内容的提问来源于stack exchange,提问作者charlieseneath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:37:57