发布/订阅请求身份验证作为服务(或通过服务密钥)而不是 Auth0 临时密钥
Posted
技术标签:
【中文标题】发布/订阅请求身份验证作为服务(或通过服务密钥)而不是 Auth0 临时密钥【英文标题】:Pub/sub request authentication as a service (or by service key) instead of Auth0 temporary key 【发布时间】:2020-05-28 15:35:49 【问题描述】:问题陈述:
我想在 google pub/sub(使用 org.apache.http.client.methods.HttpPost)中使用基于 REST 的请求来发布和订阅消息,这里我有以下将数据发布到 pub/ 的请求子主题(https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.subscriptions/pull)
POST https://pubsub.googleapis.com/v1/projects/[project_name]/topics/[topic_id]?key=[YOUR_API_KEY] HTTP/1.1
Authorization: Bearer [YOUR_ACCESS_TOKEN]
Accept: application/json
Content-Type: application/json
这里代替 [YOUR_API_KEY] 我把 api 密钥从 https://console.cloud.google.com/apis/credentials 将响应视为未经授权
"error":
"code": 403,
"message": "User not authorized to perform this action.",
"status": "PERMISSION_DENIED"
如果我添加从以下命令获取的访问令牌
gcloud auth application-default print-access-token
令牌仅在 60 分钟的有限时间内有效。 因此,我必须每小时创建一个 access_token。
由于这是一个服务器到服务器的请求,我希望请求被授权更长时间,直到没有任何外部干扰。
任何人都可以建议或指出任何错误。提前谢谢你
【问题讨论】:
Pub/Sub 不支持 API 密钥进行授权。您是否尝试授权 Pub/Sub 调用您的服务(HTTP 端点)?你的问题不清楚。print-access-token
用于测试而非实际使用。通常,您将 Pub/Sub 用于基于身份的授权的服务帐户作为 HTTP Authorization
标头分配给被调用的端点。编辑您的问题以阐明您的配置。
谢谢@John,我正在尝试将消息推送到某个主题。在这里,我有一个服务帐户。但是我必须使用基于休息的 api 来发布消息,因为我必须检查服务器状态然后拉出最佳号码。用于发布的消息。如果只提供了 api 密钥,这里的请求会以 403 响应。是不是我必须使用创建的 api 密钥创建一个身份验证,我可以在其中指定到期时间。 developers.google.com/identity/protocols/…
使用新的详细信息编辑您的问题。请记住,没有 API 密钥可供使用。您必须使用服务帐号。
【参考方案1】:
在您的用例中,使用 谷歌云平台客户端库。身份验证的最佳方法是使用称为应用程序默认凭据 (ADC) 的策略来查找应用程序的凭据。
如果使用客户端库,该策略会按以下顺序检查您的凭据:
1) ADC 检查是否设置了环境变量 GOOGLE_APPLICATION_CREDENTIALS。如果设置了变量,ADC 将使用变量指向的服务帐户文件。
2) 如果未设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量,ADC 将使用 Compute Engine、Kubernetes Engine、Cloud Run、App Engine 和 Cloud Functions 为在这些服务上运行的应用程序提供的默认服务帐号。
3) 如果 ADC 无法使用上述任一凭据,则会发生错误。
要获得全面的解释,您应该查看官方文档Setting Up Authentication for Server to Server Production Applications
【讨论】:
嗨@Paddy 感谢您的回复。但在这里我使用的是 org.apache.http.client.methods.HttpPost 。没有自动身份验证或查找环境变量的谷歌代码。我正在使用简单的 HttpPost,因为我们想要控制数据流。请纠正我,我误解了任何内容。 那么需要在HTTP请求头中使用Bearer Token进行认证以上是关于发布/订阅请求身份验证作为服务(或通过服务密钥)而不是 Auth0 临时密钥的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 上使用 IAM 或 Cognito Pool 作为身份验证方法而不是 API 密钥
只需在 HTTP 标头中发送一个密钥即可对 REST 调用进行身份验证?
订阅身份验证数据中的密钥无效,类型:websocketError