自行生成JWT调用Google Cloud Function返回401 Unauthorized求助
问题根因
你手动构造签发的是用于调用Google Open API的访问令牌(Access Token),而调用受IAM保护的Cloud Function需要的是身份令牌(ID Token),两类令牌的校验规则完全不同,这是你返回401的核心原因,不是仅调整aud字段就能解决的。
正确实现方案
建议直接使用Google官方PHP Auth库完成令牌生成,避免手动构造JWT的各类参数错误:
- 先安装官方依赖
composer require google/auth
- 替换你的
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
相关产品推荐
相关产品推荐

