Jika langganan push menggunakan autentikasi, layanan Pub/Sub akan menandatangani JWT dan mengirim JWT dalam header otorisasi permintaan push. JWT menyertakan klaim dan tanda tangan.
Pelanggan dapat memvalidasi JWT dan memverifikasi hal berikut:
- Klaim tersebut 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.
Sebelum memulai
- Pelajari langganan.
- Memahami cara kerja langganan push.
- Buat langganan push.
Format JWT
JWT adalah JWT OpenIDConnect yang terdiri dari header, kumpulan klaim, dan tanda tangan. Layanan Pub/Sub mengenkode JWT sebagai string base64 dengan pemisah 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"
Set header dan klaim adalah string JSON. Setelah didekode, data tersebut akan berbentuk seperti 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 agen layanan service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
.
Konsol
Buka halaman Pub/Sub Subscriptions.
Klik Buat langganan.
Di kolom Subscription ID, masukkan nama.
Pilih topik.
Pilih Push sebagai Jenis pengiriman.
Masukkan URL endpoint.
Centang Aktifkan autentikasi.
Pilih akun layanan.
Pastikan agen layanan
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
memiliki peraniam.serviceAccountTokenCreator
di dasbor IAM project Anda. Jika akun layanan belum diberi peran, klik Berikan di dasbor IAM untuk melakukannya.Opsional: Masukkan audiens.
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
di akun layanan kepada akun utama 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 Client ID IAP-App-Engine-app
di halaman Credentials.
Klaim
JWT dapat digunakan untuk memvalidasi bahwa klaim -- termasuk klaim email
dan aud
-- ditandatangani oleh Google. Untuk informasi selengkapnya tentang cara OAuth
2.0 API Google dapat digunakan 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
di akun layanan autentikasi push. Contoh peran tersebut adalah peran
roles/iam.serviceAccountUser
.
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
) di akun layanan push auth (atau di resource ancestor apa pun, seperti project, dari
akun layanan push auth).
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
dilindungi 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 Pub/Sub C# API.
Go
Java
Node.js
Python
Ruby
Untuk informasi tentang variabel lingkungan PUBSUB_VERIFICATION_TOKEN
yang digunakan
dalam contoh kode di atas,
lihat Menulis dan merespons pesan Pub/Sub.
Temukan contoh tambahan tentang cara memvalidasi JWT pembawa di Panduan untuk Login dengan Google untuk Situs ini. Ringkasan yang lebih luas tentang token OpenID tersedia di Panduan OpenID Connect, termasuk daftar library klien yang membantu memvalidasi JWT.
Autentikasi dari layanan Google Cloud lainnya
Fungsi Cloud Run, App Engine, dan Cloud Run mengautentikasi panggilan HTTP dari Pub/Sub dengan memverifikasi token yang dibuat Pub/Sub. Satu-satunya konfigurasi yang Anda perlu lakukan adalah memberikan peran IAM yang diperlukan ke akun pemanggil.
Lihat panduan dan tutorial berikut untuk berbagai kasus penggunaan dengan layanan ini:
Cloud Run
- Pemicuan dari push Pub/Sub:
Akun layanan autentikasi push Anda harus memiliki
peran
roles/run.invoker
dan terikat ke layanan Cloud Run untuk memanggil layanan Cloud Run yang sesuai - Tutorial menggunakan Pub/Sub dengan Cloud Run
App Engine
Fungsi Cloud Run
- Pemicu HTTP: Akun layanan autentikasi push Anda harus memiliki peran
roles/cloudfunctions.invoker
untuk memanggil fungsi jika Anda ingin menggunakan permintaan push Pub/Sub sebagai pemicu HTTP ke fungsi tersebut - Pemicu Google Cloud Pub/Sub: peran dan izin IAM dikonfigurasi secara otomatis jika Anda menggunakan pemicu Pub/Sub untuk memanggil fungsi