google-cloud-run - Cloud Run:服务到服务 401,而 curl 工作
问题描述
这是我这几天一直在想办法解决的问题。
对于我的 Cloud Run 应用程序,服务到服务的通信始终会导致 401。
对于服务中的令牌检索,我一直在使用此代码段:
tokenURL := fmt.Sprintf("/instance/service-accounts/default/identity?audience=%s", c.serviceURL)
var err error
token, err = metadata.Get(tokenURL)
if err != nil {
return nil, fmt.Errorf("metadata.Get: failed to query id_token: %+v", err)
}
我还尝试向Service account key
我的 Cloud Run 服务提供一个并使用返回的令牌google.JWTAccessTokenSourceFromJSON
无济于事。
问题是返回的 JWT 在 cURL 中使用时确实有效,但在 Cloud Run 上运行的服务中使用时无效。
Cloud Run 服务帐号和外部服务帐号(用于密钥)都具有roles/run.invoker
IAM 绑定。受众是 Cloud Run 发布的服务 URL。
我尝试了以下方法:
- 使用元数据服务检索令牌(Cloud Run 中的 401,但在 cURL 和 Postman 中使用令牌时有效)
- 使用 JWTAccessTokenSourceFromJSON 进行令牌检索(Cloud Run 中的 401,但在 cURL 和 Postman 中使用令牌时有效)
- 尝试在使用已发行令牌之前添加延迟(以防令牌未传播)
- 在延迟后尝试使用给定令牌手动 ping Cloud Run 服务几次(使用
http.Client
)
似乎没有任何效果。在 Cloud Run 中运行的每个请求都返回 401 并且日志显示The request was not authorized to invoke this service. Read more at https://cloud.google.com/run/docs/securing/authenticating
。在使用 cURL 或 Postman 时,我可以访问该服务。
我试过这些方法来调用服务:
tokenURL := fmt.Sprintf("/instance/service-accounts/default/identity?audience=%s", c.serviceURL)
var err error
token, err := metadata.Get(tokenURL)
if err != nil {
return nil, fmt.Errorf("metadata.Get: failed to query id_token: %+v", err)
}
// First one (ping)
req, _ := http.NewRequest("GET", "{{serviceURL}}", nil)
req.Header.Set("Authorization", "Bearer: "+token)
l, _ := cr.Do(req)
m, _ := ioutil.ReadAll(l.Body)
logrus.Println(l.Header)
logrus.Println(string(m))
// RoundTripper
r.Header.Set("Authorization", "Bearer: "+token)
return c.r.RoundTrip(r)
我很感激任何答案。
谢谢!
解决方案
在发布代码示例时,我刚刚意识到我在 Bearer 之后添加了一个额外的冒号(:),这使得该请求失败。不敢相信我花了几天时间来解决这个问题!
推荐阅读
- node.js - 从服务器超时发出nodejs请求
- node.js - 在 Visual Studio 中构建 Cordova 项目时出错
- stackdriver - 用于 OracleDB 的 Google Stackdriver 数据库代理?
- c# - 如何在 GetResponse 中检查 HttpStatusCode.OK
- javascript - Safari 调用 decodeAudioData 错误,在 Chrome 工作的地方出现 null
- ios - Apple 说“您的 iOS 分发证书即将到期”我需要做什么
- angular - 添加推送通知的 Ionic 3 问题
- javascript - 在谷歌地图javascript api中的两个特定标记上放置标签
- asp.net-mvc - 从 ZipCode 中检索 Lat Long
- c++ - 在 C++ 中获取类名有哪些好的技巧?