发布/订阅请求身份验证作为服务(或通过服务密钥)而不是 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

WCF 和身份验证

使用服务帐户密钥对 Google Photos API 进行身份验证?

OAuth2RestOperations 使用从请求标头获取的令牌,而不是请求身份验证服务器