Jika langganan push menggunakan autentikasi, layanan Pub/Sub akan menandatangani JWT dan mengirimkan JWT di header otorisasi permintaan push. JWT mencakup 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.
- Pahami cara kerja langganan push.
- Buat langganan push.
Format JWT
JWT adalah OpenIDConnect JWT 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, bentuknya 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 memerlukan waktu hingga satu jam.
Mengonfigurasi Pub/Sub untuk autentikasi push
Contoh berikut menunjukkan cara menetapkan akun layanan push auth ke akun layanan pilihan Anda dan cara memberikan peran iam.serviceAccountTokenCreator
kepada akun layanan yang dikelola Google
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
.
Konsol
Buka halaman Pub/Sub Subscriptions.
Klik Buat langganan.
Di kolom ID Langganan, masukkan nama.
Pilih topik.
Pilih Push sebagai Jenis pengiriman.
Masukkan URL titik akhir.
Centang Aktifkan autentikasi.
Pilih akun layanan.
Pastikan akun layanan yang dikelola Google
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 Google-managed service account # `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
kepada akun utama yang memulai pembuatan atau pembaruan langganan
di akun layanan. Untuk mengetahui informasi selengkapnya, lihat Autentikasi di bagian "Membuat langganan push".
Jika Anda menggunakan langganan push terautentikasi dengan aplikasi App Engine yang dilindungi dengan Identity-Aware Proxy, Anda harus memberikan Client ID IAP sebagai audiens token autentikasi push.
Untuk mengaktifkan IAP pada 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 penggunaan OAuth
2.0 API Google untuk autentikasi dan otorisasi, lihat
OpenID Connect.
Ada dua mekanisme yang membuat klaim ini bermakna. Pertama,
Pub/Sub mengharuskan pengguna atau akun layanan melakukan
panggilan CreateSubscription, UpdateSubscription, atauModifyPushConfig agar memiliki
peran
dengan izin iam.serviceAccounts.actAs
di akun layanan
push auth. Contoh peran ini adalah
peran
roles/iam.serviceAccountUser
.
Kedua, akses ke sertifikat yang digunakan untuk menandatangani token dikontrol secara ketat. Untuk membuat token, Pub/Sub harus memanggil layanan Google internal menggunakan identitas akun layanan penandatanganan terpisah, yang merupakan akun layanan yang dikelola Google 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 mana 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 audience dalam token cocok dengan nilai yang ditetapkan dalam konfigurasi langganan push.
Contoh berikut menggambarkan 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 informasi selengkapnya, lihat dokumentasi referensi Pub/Sub C# API.
Go
Java
Node.js
Python
Ruby
Untuk mengetahui 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 pemilik di artikel Panduan Login dengan Google untuk Situs ini. Ringkasan token OpenID yang lebih luas tersedia di Panduan OpenID Connect, termasuk daftar library klien yang membantu memvalidasi JWT.
Autentikasi dari layanan Google Cloud lainnya
Cloud Run, App Engine, dan Cloud Functions mengautentikasi panggilan HTTP dari Pub/Sub dengan memverifikasi token yang dihasilkan Pub/Sub. Satu-satunya konfigurasi yang Anda butuhkan adalah memberikan peran IAM yang diperlukan ke akun pemanggil.
Lihat panduan dan tutorial berikut untuk berbagai kasus penggunaan layanan ini:
Cloud Run
- Pemicuan dari Pub/Sub push: Akun layanan push auth Anda harus memiliki peran
roles/run.invoker
dan terikat dengan layanan Cloud Run untuk memanggil layanan Cloud Run yang sesuai - Tutorial menggunakan Pub/Sub dengan Cloud Run
App Engine
Cloud Functions
- Pemicu HTTP: Akun layanan push auth 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