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
- Pelajari langganan.
- Pahami 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 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 kepada
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
agen layanan.
Konsol
Buka halaman Pub/Sub Subscriptions.
Klik Create subscription.
Di kolom Subscription ID, masukkan nama.
Pilih topik.
Pilih Push sebagai Delivery type.
Masukkan URL endpoint.
Centang Enable authentication.
Pilih akun layanan.
Pastikan agen layanan
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.commemiliki peraniam.serviceAccountTokenCreatordi dasbor IAM project Anda. Jika akun layanan belum diberi peran, klik Grant 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 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 mengharuskan pengguna atau akun layanan yang melakukan panggilan CreateSubscription, UpdateSubscription, atau ModifyPushConfig 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.
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 pembawa di Panduan untuk Login dengan Google untuk Situs. Ringkasan yang lebih luas tentang token OpenID tersedia di Panduan OpenID Connect, termasuk daftar library klien yang membantu memvalidasi JWT.
Autentikasi dari layanan lain Google Cloud
Fungsi Cloud Run dan App Engine mengautentikasi panggilan HTTP dari Pub/Sub dengan memverifikasi token yang dibuat Pub/Sub. Satu-satunya konfigurasi yang Anda perlukan adalah memberikan peran IAM yang diperlukan ke akun pemanggil.
Lihat panduan dan tutorial berikut untuk berbagai kasus penggunaan dengan layanan ini:
Cloud Run
- Memicu dari push Pub/Sub:
Akun layanan autentikasi push Anda harus memiliki peran
roles/run.invokerdan terikat ke layanan Cloud Run untuk memanggil layanan Cloud Run yang sesuai - Tutorial menggunakan Pub/Sub dengan Cloud Run
App Engine
Cloud Run Functions
- Pemicu HTTP:
Akun layanan autentikasi push Anda harus memiliki
roles/cloudfunctions.invokerperan 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