Autentikasi untuk langganan push

Jika langganan push menggunakan autentikasi, layanan Pub/Sub akan menandatangani Token Web JSON (JWT) dan mengirim JWT di header otorisasi permintaan push. JWT menyertakan klaim dan tanda tangan.

Pelanggan dapat memvalidasi JWT dan memverifikasi hal berikut:

  • Klaimnya akurat.
  • Layanan Pub/Sub menandatangani klaim.

Jika pelanggan menggunakan firewall, mereka tidak dapat menerima permintaan push. Untuk menerima permintaan push, Anda harus menonaktifkan firewall dan memverifikasi JWT. Jika pelanggan memiliki firewall, Anda mungkin menerima error 403 permission denied.

Sebelum memulai

Format JWT

JWT adalah JWT OpenIDConnect yang terdiri dari header, kumpulan klaim, dan tanda tangan. Layanan Pub/Sub mengenkode JWT sebagai string base64 dengan pembatas titik.

Misalnya, header otorisasi berikut menyertakan JWT yang dienkode:

"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" 

Header dan kumpulan klaim adalah string JSON. Setelah didekode, keduanya akan memiliki format berikut:

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

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

Token yang dilampirkan ke permintaan yang dikirim ke endpoint push mungkin sudah berusia hingga satu jam.

Mengonfigurasi Pub/Sub untuk autentikasi push

Contoh berikut menunjukkan cara menetapkan akun layanan autentikasi push ke akun layanan pilihan Anda dan cara memberikan peran iam.serviceAccountTokenCreator ke service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com agen layanan.

Konsol

  1. Buka halaman Pub/Sub Subscriptions.

    Buka halaman Subscription

  2. Klik Create subscription.

  3. Di kolom Subscription ID, masukkan nama.

  4. Pilih topik.

  5. Pilih Push sebagai Delivery type.

  6. Masukkan URL endpoint.

  7. Centang Enable authentication.

  8. Pilih akun layanan.

  9. Pastikan agen layanan service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com memiliki peran iam.serviceAccountTokenCreator di dasbor IAM project Anda. Jika akun layanan belum diberi peran, klik Grant di dasbor IAM untuk melakukannya.

  10. Opsional: Masukkan audiens.

  11. Klik Create.

gcloud

# Configure the push subscription
gcloud pubsub subscriptions (create|update|modify-push-config) ${SUBSCRIPTION} \
 --topic=${TOPIC} \
 --push-endpoint=${PUSH_ENDPOINT_URI} \
 --push-auth-service-account=${SERVICE_ACCOUNT_EMAIL} \
 --push-auth-token-audience=${OPTIONAL_AUDIENCE_OVERRIDE}

# Your service agent
# `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the
# `iam.serviceAccountTokenCreator` role.
PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
 --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
 --role='roles/iam.serviceAccountTokenCreator'

Saat mengaktifkan autentikasi untuk langganan push, Anda mungkin mengalami error permission denied atau not authorized. Untuk mengatasi masalah ini, berikan izin iam.serviceAccounts.actAs pada akun layanan kepada principal yang memulai pembuatan atau pembaruan langganan. Untuk mengetahui informasi selengkapnya, lihat Autentikasi di "Membuat langganan push."

Jika Anda menggunakan langganan push yang diautentikasi dengan aplikasi App Engine yang diamankan dengan Identity-Aware Proxy, Anda harus memberikan Client ID IAP sebagai audiens token autentikasi push. Untuk mengaktifkan IAP di aplikasi App Engine, lihat Mengaktifkan IAP. Untuk menemukan client ID IAP, cari IAP-App-Engine-app Client ID di halaman Kredensial.

Klaim

JWT dapat digunakan untuk memvalidasi bahwa klaim -- termasuk klaim email dan aud -- ditandatangani oleh Google. Untuk mengetahui informasi selengkapnya tentang cara penggunaan OAuth 2.0 API Google untuk autentikasi dan otorisasi, lihat OpenID Connect.

Ada dua mekanisme yang membuat klaim ini bermakna. Pertama, Pub/Sub mewajibkan pengguna atau akun layanan yang melakukan panggilan CreateSubscription, UpdateSubscription, atau ModifyPushConfig untuk memiliki peran dengan izin iam.serviceAccounts.actAs pada akun layanan autentikasi push. Contoh peran tersebut adalah roles/iam.serviceAccountUser peran.

Kedua, akses ke sertifikat yang digunakan untuk menandatangani token dikontrol dengan ketat. Untuk membuat token, Pub/Sub harus memanggil layanan Google internal menggunakan identitas akun layanan penandatanganan terpisah, yaitu agen layanan service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com. Akun layanan penandatanganan ini harus memiliki izin iam.serviceAccounts.getOpenIdToken atau peran Service Account Token Creator (roles/iam.serviceAccountTokenCreator) pada akun layanan autentikasi push (atau pada resource induk mana pun, seperti project, dari akun layanan autentikasi push).

Memvalidasi token

Memvalidasi token yang dikirim oleh Pub/Sub ke endpoint push melibatkan:

  • Memeriksa integritas token menggunakan validasi tanda tangan.
  • Memastikan bahwa klaim email dan audiens dalam token cocok dengan nilai yang ditetapkan dalam konfigurasi langganan push.

Contoh berikut mengilustrasikan cara mengautentikasi permintaan push ke aplikasi App Engine yang tidak diamankan dengan Identity-Aware Proxy. Jika aplikasi App Engine Anda diamankan dengan IAP, header permintaan HTTP yang berisi JWT IAP adalah x-goog-iap-jwt-assertion dan harus divalidasi sebagaimana mestinya.

protokol

Permintaan:

GET https://oauth2.googleapis.com/tokeninfo?id_token={BEARER_TOKEN}

Respons:

200 OK
{
    "alg": "RS256",
    "aud": "example.com",
    "azp": "104176025330667568672",
    "email": "{SERVICE_ACCOUNT_NAME}@{YOUR_PROJECT_NAME}.iam.gserviceaccount.com",
    "email_verified": "true",
    "exp": "1555463097",
    "iat": "1555459497",
    "iss": "https://accounts.google.com",
    "kid": "3782d3f0bc89008d9d2c01730f765cfb19d3b70e",
    "sub": "104176025330667568672",
    "typ": "JWT"
}

C#

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan C# di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API C# Pub/Sub.

/// <summary>
/// Extended JWT payload to match the pubsub payload format.
/// </summary>
public class PubSubPayload : JsonWebSignature.Payload
{
    [JsonProperty("email")]
    public string Email { get; set; }
    [JsonProperty("email_verified")]
    public string EmailVerified