Cloud Functions OAuth2.0认证401错误排查及自动化调用需求
Cloud Functions OAuth2.0调用401未授权问题解决指南
问题概述
尝试调用Cloud Functions的uploadBase64File HTTP函数:
functions.http('uploadBase64File', async (req, res) => {...});
通过Postman的OAuth2.0流程获取Access Token并添加到请求头后,返回401未授权错误:
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>401 Unauthorized</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Unauthorized</h1> <h2>Your client does not have permission to the requested URL <code>/</code>.</h2> </body> </html>
临时开启「允许未认证调用」可正常访问,但不符合安全规范。
已做配置
- IAM中为Owner角色添加了
cloudfunctions.functions.invoke权限 - 个人Gmail账号及函数服务主体已分配以下角色:
- Cloud Functions Admin
- Cloud Functions Invoker
- Cloud Run Admin
- Cloud Run Invoker
- Cloud Run Service Invoker
- 通过
gcloud auth print-identity-token手动获取的Bearer Token可正常调用函数
需求
需要在Make(原Integromat)中实现自动化调用,且无需手动刷新过期Token。
Postman OAuth2.0配置
- 回调URL: https://oauth.pstmn.io/v1/callback
- 授权URL: https://accounts.google.com/o/oauth2/v2/auth
- Access Token URL: https://oauth2.googleapis.com/token
- 客户端ID/密钥: 来自IAM OAuth 2.0客户端
- 权限范围: https://www.googleapis.com/auth/cloud-platform
- 客户端认证方式: 以Basic Auth请求头发送
解决步骤
1. 修正Token受众(Audience)
手动通过gcloud获取的Token默认将Cloud Functions的URL作为受众,而Postman OAuth流程获取的Token受众是https://www.googleapis.com/auth/cloud-platform,不符合Cloud Functions的认证要求。
在Postman的OAuth2.0配置中,添加自定义参数:
- 键:
audience - 值: 函数的完整URL(例如
https://us-central1-your-project.cloudfunctions.net/uploadBase64File)
2. 优化权限范围
将宽泛的https://www.googleapis.com/auth/cloud-platform权限替换为更精准的https://www.googleapis.com/auth/cloudfunctions,既满足调用需求,又降低权限风险。
3. 配置Make平台的自动Token刷新
在Make中创建OAuth2.0连接时,按以下配置:
- 授权类型选择「授权码流(Authorization Code)」
- 使用Make提供的专属回调URL(在连接设置中可直接复制)
- 授权URL:
https://accounts.google.com/o/oauth2/v2/auth - Token URL:
https://oauth2.googleapis.com/token - 客户端ID/密钥: 与Postman一致
- 权限范围:
https://www.googleapis.com/auth/cloudfunctions - 客户端认证方式选择「以Basic Auth头发送」
Make会自动处理Token的过期检测与刷新,无需手动干预。
4. 验证IAM绑定
确保函数的IAM权限中,已将Cloud Functions Invoker角色分配给:
- 若使用个人账号授权:直接分配给你的Gmail账号
- 若使用服务账号:分配给OAuth2.0客户端关联的服务账号
内容的提问来源于stack exchange,提问作者Paweł Ostromecki
相关产品推荐
相关产品推荐

