推送订阅身份验证

如果推送订阅使用身份验证,则 Pub/Sub 服务会签署 JSON Web 令牌(JWT)并在推送请求的授权标头中发送 JWT。JWT 包含声明和签名。

订阅者可以验证 JWT 并验证以下内容:

  • 声明准确无误。
  • Pub/Sub 服务签署了声明。

如果订阅者使用防火墙,则无法接收推送请求。要接收推送请求,您必须关闭防火墙并验证 JWT。 如果订阅者有防火墙,您可能会收到 403 permission denied 错误。

准备工作

JWT 格式

JWT 是一个 OpenIDConnect JWT,包含标头、声明集和签名三个部分。Pub/Sub 服务将 JWT 编码为具有英文句点分隔符的 base64 字符串。

例如,以下授权标头包含已编码的 JWT:

"Authorization" : "Bearer
eyJhbGciOiJSUzI1NiIsImtpZCI6IjdkNjgwZDhjNzBkNDRlOTQ3MTMzY2JkNDk5ZWJjMWE2MWMzZDVh
YmMiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJodHRwczovL2V4YW1wbGUuY29tIiwiYXpwIjoiMTEzNzc0M
jY0NDYzMDM4MzIxOTY0IiwiZW1haWwiOiJnYWUtZ2NwQGFwcHNwb3QuZ3NlcnZpY2VhY2NvdW50LmNvb
SIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJleHAiOjE1NTAxODU5MzUsImlhdCI6MTU1MDE4MjMzNSwia
XNzIjoiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTEzNzc0MjY0NDYzMDM4MzIxO
TY0In0.QVjyqpmadTyDZmlX2u3jWd1kJ68YkdwsRZDo-QxSPbxjug4ucLBwAs2QePrcgZ6hhkvdc4UHY
4YF3fz9g7XHULNVIzX5xh02qXEH8dK6PgGndIWcZQzjSYfgO-q-R2oo2hNM5HBBsQN4ARtGK_acG-NGG
WM3CQfahbEjZPAJe_B8M7HfIu_G5jOLZCw2EUcGo8BvEwGcLWB2WqEgRM0-xt5-UPzoa3-FpSPG7DHk7
z9zRUeq6eB__ldb-2o4RciJmjVwHgnYqn3VvlX9oVKEgXpNFhKuYA-mWh5o7BCwhujSMmFoBOh6mbIXF
cyf5UiVqKjpqEbqPGo_AvKvIQ9VTQ" 

标头和声明集是 JSON 字符串。解码后,它们将采用以下格式:

{"alg":"RS256","kid":"7d680d8c70d44e947133cbd499ebc1a61c3d5abc","typ":"JWT"}

{
   "aud":"https://example.com",
   "azp":"113774264463038321964",
   "email":"gae-gcp@",
   "sub":"113774264463038321964",
   "email_verified":true,
   "exp":1550185935,
   "iat":1550182335,
   "iss":"https://accounts.google.com"
  }

附加到发送到推送端点的请求的令牌可具有最长达一个小时的生命周期。

为推送身份验证配置 Pub/Sub

以下示例展示了如何将推送身份验证服务账号设置为您选择的服务账号,以及如何向 service-{PROJECT_NUMBER}@gcp-sa-pubsub. 服务代理授予 iam.serviceAccountTokenCreator 角色。

控制台

  1. 前往 Pub/Sub 订阅页面。

    转到“订阅”页面

  2. 点击创建订阅

  3. 订阅 ID 字段中,输入一个名称。

  4. 选择主题。

  5. 选择推送作为传送类型

  6. 输入端点网址。

  7. 勾选启用身份验证

  8. 选择服务账号。

  9. 确保服务代理 service-{PROJECT_NUMBER}@gcp-sa-pubsub. 在项目的 IAM 信息中心内具有 iam.serviceAccountTokenCreator 角色。 如果服务账号尚未获得该角色,请在 IAM 控制台中点击授予以授予该角色。

  10. 可选:输入受众群体。

  11. 点击创建

gcloud

# Configure the push subscription
gcloud pubsub subscriptions (create|update|modify-push-config) ${SUBSCRIPTION} \
 --topic=${TOPIC} \
 --push-endpoint=${PUSH_ENDPOINT_URI} \