Google 云 Pub/Sub:推送订阅不调用受 IAP 保护的 GAE 应用

Google Cloud Pub/Sub: push subscription doesn't call IAP-protected GAE app

我有一个带有推送订阅的 Pub/Sub 主题。我希望在向主题发布消息时调用我的 AppEngine 应用程序。
以下是我创建订阅的方式:

      subscriber.create_subscription(
          name=subscription_name,
          topic=pubsub_topic,
          push_config=pubsub_v1.types.PushConfig(
              push_endpoint=f'my_gae_app_hostname/api/update',
              oidc_token=pubsub_v1.types.PushConfig.OidcToken(
                  service_account_email=f"{project_id}@appspot.gserviceaccount.com")))

我的 GAE 应用支持身份识别代理 (IAP)。没有 IAP 一切正常。但是,如果启用 IAP,则不会调用 GAE。日志中没有任何错误。在 Cloud Console 中,在 Pub/Sub 订阅页面上,我只能看到有未送达的消息(在概览图上)。

IAP 有一个我用于订阅的 GAE 默认帐户的主体 (service_account_email)

我授予 Pub/Sub SA iam.serviceAccountTokenCreator 角色(尽管根据 docs 它不再需要):

gcloud projects add-iam-policy-binding $PROJECT_ID
  --member="serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com" 
  --role=roles/iam.serviceAccountTokenCreator

我也尝试创建一个单独的 SA(如本 answer 中所建议),但没有帮助。

您必须指定正确的观众。当您使用 App Engine 和 IAP 时,受众是不寻常的。我 wrote an article 您可以在哪里找到要设置的正确值。

为了加快搜索速度,这里是最重要的信息:

  • 观众有这种模式<PROJECT_NUMBER>-<HASH>.apps.googleusercontent.com
  • 受众是IAP客户端ID。您可以前往 API & Services 和 select Credentials 找到它。查看 OAuth 2.0 client IDs 并查找 IAP-App-Engine-app 行并复制 Client ID