You need to enable JavaScript to run this app. 自行生成JWT调用Google Cloud Function返回401 Unauthorized求助
优惠活动
大模型
产品
解决方案
定价
更多

自行生成JWT调用Google Cloud Function返回401 Unauthorized求助

问题根因

你手动构造签发的是用于调用Google Open API的访问令牌(Access Token),而调用受IAM保护的Cloud Function需要的是身份令牌(ID Token),两类令牌的校验规则完全不同,这是你返回401的核心原因,不是仅调整aud字段就能解决的。

正确实现方案

建议直接使用Google官方PHP Auth库完成令牌生成,避免手动构造JWT的各类参数错误:

  1. 先安装官方依赖
composer require google/auth
  1. 替换你的getToken方法逻辑
<?php
use Google\Auth\Credentials\ServiceAccountCredentials;

protected function getToken()
{
    // 此处填写你的云函数完整访问URL,和getHTML方法里的$cloudFunctionURL完全一致
    $targetAudience = "https://region-project-name.cloudfunctions.net/function-name";
    // 替换为你的服务账号密钥文件本地路径,也可以直接传入解析后的密钥数组
    $serviceAccountKey = '/path/to/your-service-account.json';

    $credentials = new ServiceAccountCredentials(
        [], // 生成ID Token不需要传scope
        $serviceAccountKey,
        $targetAudience // aud固定为云函数的完整URL
    );

    $authResult = $credentials->fetchAuthToken();
    return $authResult['id_token'];
}

必做校验项

  • 你使用的服务账号必须在目标云函数的权限配置中,被授予Cloud Functions 调用者(roles/cloudfunctions.invoker)权限
  • 生成ID Token时传入的targetAudience必须和你实际请求的云函数URL完全一致,包含协议头、域名、路径,不能多/少末尾斜杠、不能修改任意字符
  • 云函数的访问配置不能开启公开访问,必须设置为需要身份验证

如果你一定要手动实现ID Token生成逻辑,注意你自行构造的JWT不能直接作为请求令牌使用,需要先将该JWT发送到Google官方OAuth2令牌交换接口交换为官方签发的ID Token后,才能用于请求云函数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 04:57:03