Ringkasan
Library Google Auth adalah library klien autentikasi open source untuk Java. Dokumen ini menjelaskan cara menggunakan library ini untuk mengautentikasi aplikasi Java Anda agar dapat mengakses layanan Google Cloud .
Dengan mengikuti panduan ini, Anda akan mempelajari cara:
- Tambahkan dependensi Library Auth yang diperlukan ke project Anda menggunakan Maven, Gradle, atau Simple Build Tool (SBT).
- Melakukan autentikasi menggunakan berbagai metode, dengan fokus pada Kredensial Default Aplikasi (ADC).
- Mengonfigurasi skenario autentikasi lanjutan, termasuk Workload Identity Federation, Workforce Identity Federation, dan peniruan akun layanan.
- Membuat dan menggunakan token yang diperkecil cakupannya untuk membatasi izin.
- Mengintegrasikan kredensial dengan library klien HTTP Google.
Dokumentasi ini ditujukan untuk developer Java. Untuk mengetahui detail API selengkapnya, lihat Dokumentasi API Library Auth Google.
Library Google Auth untuk Java terdiri dari empat artefak:
google-auth-library-credentialsberisi class dasar dan antarmuka untuk kredensial Google.google-auth-library-appengineberisi kredensial App Engine dan bergantung pada App Engine SDK.google-auth-library-oauth2-httpberisi berbagai kredensial dan metode utilitas, termasuk kemampuan untuk mendapatkan Kredensial Default Aplikasi. Library ini juga menyediakan pendekatan sisi server untuk membuat token dengan cakupan yang dipersempit.google-auth-library-cab-token-generatormenyediakan pendekatan sisi klien untuk membuat token yang diperkecil cakupannya.
Memvalidasi konfigurasi kredensial
Saat Anda menggunakan konfigurasi kredensial, seperti JSON, jalur file, atau aliran data, dari sumber eksternal, Anda harus memvalidasinya. Memberikan kredensial yang tidak divalidasi ke Google API atau library klien untuk autentikasi keGoogle Cloud dapat membahayakan keamanan sistem dan data Anda.
Untuk mengetahui informasi selengkapnya, lihat Kredensial yang bersumber dari eksternal. Kredensial Default Aplikasi.
Mengimpor Library Auth
Untuk mengimpor Library Auth, gunakan com.google.cloud:libraries-bom atau gunakan
Bill of Materials Library Google Auth dengan Maven atau Gradle.
Libraries-bom Java SDK
Untuk melakukan autentikasi ke library klien di Java SDK
(misalnya, google-cloud-datastore) menggunakan Library Auth, gunakan
libraries-bom, yang akan mengambil versi Library Auth yang kompatibel
dengan library klien tersebut.
Misalnya, untuk mengimpor Library Auth dengan Maven menggunakan pom.xml:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
<version>26.53.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Jika Anda tidak menggunakan libraries-bom atau library klien lainnya, impor modul Auth secara langsung dengan Bill of Materials Library Google Auth.
Bill of Materials Library Google Auth
Anda dapat menggunakan Bill of Materials Library Google Auth untuk memastikan bahwa modul Auth dan dependensi transitif yang relevan kompatibel.
Maven
Tambahkan kode berikut ke file pom.xml Anda:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-bom</artifactId>
<version>1.30.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Di bagian <dependencies>, Anda dapat menentukan modul Auth yang diperlukan. Misalnya, untuk menyertakan modul google-auth-library-oauth2-http,
tambahkan item <dependency> berikut:
<dependency>
<groupId>com.google.auth</groupId>
<!-- Let the BOM manage the module and dependency versions -->
<!-- Replace with the module(s) that are needed -->
<artifactId>google-auth-library-oauth2-http</artifactId>
</dependency>
Ganti google-auth-library-oauth2-http dalam contoh dengan
google-auth-library-credentials atau
google-auth-library-appengine, bergantung pada kebutuhan aplikasi Anda.
Gradle
Serupa dengan Maven, pengguna Gradle dapat menggunakan google-auth-library-bom untuk mengelola versi dependensi dan memastikan kompatibilitas antara berbagai modul google-auth-library.
Untuk menggunakan BOM dengan Gradle, tambahkan BOM sebagai dependensi platform. Kemudian, tambahkan
modul google-auth-library yang Anda perlukan. BOM memastikan bahwa
versi semua modul yang Anda gunakan kompatibel. Misalnya, tambahkan kode berikut ke file build.gradle Anda:
dependencies {
// The BOM will manage the module versions and transitive dependencies
implementation platform('com.google.auth:google-auth-library-bom:1.30.1')
// Replace with the module(s) that are needed
implementation 'com.google.auth:google-auth-library-oauth2-http'
}
Scala
Tidak seperti Maven dan Gradle, SBT (Scala Build Tool) tidak mendukung Bill of Materials (BOM) Maven. Oleh karena itu, saat menggunakan Scala, Anda tidak dapat mengimpor
google-auth-library-bom untuk otomatis menangani versi yang kompatibel dari
modul Library Auth dan dependensi transitifnya.
Sebagai gantinya, Anda harus menambahkan setiap submodul yang diperlukan langsung ke
file build.sbt. Sangat penting untuk menentukan dan menyelaraskan versi semua modul google-auth-library yang Anda gunakan secara eksplisit. Jika versi tidak konsisten,
konflik versi dapat terjadi di antara dependensi transitif,
yang berpotensi menyebabkan perilaku yang tidak terduga atau error runtime dalam aplikasi Anda.
Tambahkan kode ini ke dependensi Anda jika menggunakan SBT:
// Replace this with the implementation module that suits your needs
libraryDependencies += "com.google.auth" % "google-auth-library-oauth2-http" % "1.30.1"
Logging Library Auth
Library Auth Java merekomendasikan logging menggunakan logging debug library klien. Logging debug akan melakukan hashing pada token sensitif (misalnya, access_token,
refresh_token, dll.) dan nilainya akan disamarkan. Logging dengan java.util.logging dinonaktifkan di Library Auth untuk mencegah kebocoran token sensitif.
Fungsi logging debug klien bersifat opsional dan memerlukan penyiapan.
Logging Debug dapat mencatat hal berikut berdasarkan level log:
- Informasi Permintaan: Header, URL, Metode (Level INFO)
- Informasi Respons: Header, Status, Pesan (level INFO)
- Payload Respons (level DEBUG)
Bermigrasi dari GoogleCredential ke GoogleCredentials
GoogleCredential
dari google-api-java-client tidak digunakan lagi dan GoogleCredentials adalah
pengganti yang direkomendasikan.
Buat instance GoogleCredentials menggunakan
Kredensial Default Aplikasi (ADC).
Berikut adalah pendekatan yang direkomendasikan:
GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
Cara Anda menggunakan GoogleCredentials bergantung pada library klien:
Library Klien Cloud: Library ini otomatis menggunakan Kredensial Default Aplikasi (ADC), sehingga Anda tidak perlu memberikan kredensial dalam kode.
Library Klien Google API: Anda harus membuat instance
GoogleCredentialsdan meneruskannya ke klien. Sebagai contoh, lihat Panduan Klien Java Google API.
Kredensial Default Aplikasi
Library Auth Google menyediakan implementasi Kredensial Default Aplikasi (ADC) untuk Java. ADC menyediakan cara untuk mendapatkan kredensial otorisasi guna memanggil Google API.
Gunakan ADC jika aplikasi Anda memerlukan identitas dan tingkat otorisasi yang konsisten, terlepas dari pengguna. Sebaiknya gunakan ADC untuk mengizinkan panggilan ke Cloud API, terutama saat membangun aplikasi di Google Cloud.
ADC juga mendukung Workload Identity Federation, yang memungkinkan aplikasi mengakses resource Google Cloud dari platform eksternal seperti Amazon Web Services (AWS), Microsoft Azure, atau penyedia identitas apa pun yang mendukung OpenID Connect (OIDC). Sebaiknya gunakan workload identity federation untuk lingkungan non-Google Cloud karena menghilangkan kebutuhan untuk mendownload, mengelola, dan menyimpan kunci pribadi akun layanan secara lokal.
Mendapatkan Kredensial Default Aplikasi
Untuk mendapatkan Kredensial Default Aplikasi, gunakan GoogleCredentials.getApplicationDefault()
atau GoogleCredentials.getApplicationDefault(HttpTransportFactory). Metode ini menampilkan Kredensial Default Aplikasi untuk mengidentifikasi dan mengizinkan seluruh aplikasi.
Berikut ini adalah urutan penelusuran untuk menemukan Kredensial Default Aplikasi:
- File kredensial yang ditunjukkan oleh variabel lingkungan
GOOGLE_APPLICATION_CREDENTIALS. - Kredensial yang disediakan oleh perintah
gcloud auth application-default loginGoogle Cloud SDK. - Kredensial bawaan Google App Engine.
- Kredensial bawaan shellGoogle Cloud .
- Kredensial bawaan Google Compute Engine.
- Lewati pemeriksaan ini dengan menetapkan variabel lingkungan
NO_GCE_CHECK=true. - Sesuaikan alamat server metadata dengan menetapkan variabel lingkungan
GCE_METADATA_HOST=<hostname>.
- Lewati pemeriksaan ini dengan menetapkan variabel lingkungan
Pemuatan kredensial eksplisit
Untuk mendapatkan kredensial dari kunci JSON Akun Layanan, gunakan
GoogleCredentials.fromStream(InputStream) atau
GoogleCredentials.fromStream(InputStream, HttpTransportFactory) seperti yang ditunjukkan dalam
contoh kode berikut.
Kredensial harus dimuat ulang sebelum token akses tersedia.
GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream("/path/to/credentials.json"));
credentials.refreshIfExpired();
AccessToken token = credentials.getAccessToken();
// OR
AccessToken token = credentials.refreshAccessToken();
Kredensial yang ditiru identitasnya
Gunakan ImpersonatedCredentials untuk mengizinkan kredensial (akun utama)
meniru akun layanan (target). Hal ini memungkinkan akun utama mengakses resource sebagai target, tanpa memerlukan kunci pribadi target.
Untuk menggunakan ImpersonatedCredentials, Anda harus memenuhi persyaratan berikut:
- Project akun utama harus mengaktifkan
IAMCredentialsAPI. - Akun utama harus memiliki peran
Service Account Token Creator(Identity and Access Management) di akun layanan target.
Contoh kode berikut membuat ImpersonatedCredentials. Kredensial akun utama diperoleh dari Kredensial Default Aplikasi (ADC). ImpersonatedCredentials yang dihasilkan kemudian digunakan untuk mengakses Google Cloud Storage sebagai akun layanan target.
// The principal (ADC) has the Service Account Token Creator role on the target service account.
GoogleCredentials sourceCredentials =
GoogleCredentials.getApplicationDefault()
.createScoped(Arrays.asList("https://www.googleapis.com/auth/iam"));
ImpersonatedCredentials credentials =
ImpersonatedCredentials.newBuilder()
.setSourceCredentials(sourceCredentials)
.setTargetPrincipal(
"impersonated-account@project.")
.setScopes(Arrays.asList("https://www.googleapis.com/auth/devstorage.read_only"))
.build();
Storage storage =
StorageOptions.newBuilder().setProjectId("project-id").setCredentials(credentials).build()
.getService();
for (Bucket b : storage.list().iterateAll()) {
System.out.println(b);
}
Token terikat sertifikat untuk identitas agen
Saat aplikasi Anda berjalan dengan
identitas agen (misalnya, layanan atau tugas Cloud Run yang di-deploy dengan
--identity-type=agent-identity), ComputeEngineCredentials akan meminta
token akses dan token ID terikat sertifikat dari server metadata secara
default. Token terikat dikaitkan dengan sertifikat X.509 workload dan memerlukan
pembuktian kepemilikan kunci pribadi yang cocok melalui mutual TLS (mTLS). Karena
kunci pribadi tersebut hanya tersedia untuk workload, token yang bocor tidak dapat digunakan
dari tempat lain.
Token terikat hanya diterima jika permintaan yang membawanya dikirim melalui mTLS dengan sertifikat yang sama.
Library Klien Cloud untuk Java
mengonfigurasi mTLS dan memuat ulang sertifikat workload yang dirotasi secara otomatis saat identitas agen
diaktifkan. Jika Anda memanggil Google API dengan klien HTTP Anda sendiri, Anda harus mengonfigurasi mTLS dengan sertifikat workload dan memuat ulang sertifikat tersebut saat runtime merotasi sertifikat di disk. Setelah rotasi, token refresh yang baru akan terikat ke sertifikat baru; jika token baru dikirim melalui koneksi mTLS yang dibuat dengan sertifikat sebelumnya, API akan menolak permintaan dengan 401 UNAUTHENTICATED.
Library hanya meminta token terikat jika semua hal berikut terpenuhi:
- Sertifikat workload ditemukan, baik melalui file yang diberi nama oleh
variabel lingkungan
GOOGLE_API_CERTIFICATE_CONFIGatau di lokasi default (/var/run/secrets/workload-spiffe-credentials/). - ID SPIFFE sertifikat termasuk dalam domain kepercayaan identitas agen.
- Pengikatan token dan mTLS belum dinonaktifkan (lihat Menonaktifkan pengikatan token).
Di semua lingkungan lainnya, ComputeEngineCredentials berperilaku seperti sebelumnya dan
menampilkan token yang tidak terikat.
Menonaktifkan pengikatan token
Jika Anda perlu menonaktifkan pengikatan token (lihat Batasan umum), tetapkan variabel lingkungan berikut:
GOOGLE_API_ENABLE_RUNTIME_BOUND_TOKEN=false
| Variabel lingkungan | Efek |
|---|---|
GOOGLE_API_ENABLE_RUNTIME_BOUND_TOKEN |
Tetapkan ke false untuk meminta token tidak terikat. |
GOOGLE_API_USE_CLIENT_CERTIFICATE |
Menyetelnya ke false akan menonaktifkan mTLS sepenuhnya, yang juga akan menonaktifkan pengikatan token. Pilih GOOGLE_API_ENABLE_RUNTIME_BOUND_TOKEN=false jika Anda hanya memerlukan token tidak terikat. |
Nilai tidak peka huruf besar/kecil dan spasi kosong di sekitarnya akan diabaikan. Hanya false
yang menonaktifkan fitur; nilai lainnya akan mempertahankan setelan default.
Variabel lingkungan berlaku untuk seluruh proses, sehingga menonaktifkan pengikatan token akan memengaruhi setiap library di aplikasi Anda yang menggunakan Kredensial Default Aplikasi, bukan hanya library yang membutuhkannya. Jika Anda hanya memerlukan token ID tidak terikat untuk beberapa target, gunakan opsi per target yang dijelaskan dalam Meminta token ID tidak terikat untuk target tertentu.
Meminta token ID tidak terikat untuk target tertentu
Token ID terikat menyertakan sidik jari sertifikat workload dalam klaim cnf
(x5t#S256). Layanan penerima dapat memvalidasi klaim ini terhadap sertifikat klien yang ditampilkan selama handshake mTLS, atau mengabaikan klaim jika tidak menerapkan binding sertifikat.
Cloud Run otomatis menerapkan pengikatan sertifikat saat klaim cnf ada dalam token ID. Jika Anda memanggil layanan Cloud Run
dengan token ID terikat, Anda harus memanggil URL *.mtls.run.app-nya melalui
mTLS; permintaan ke URL *.run.app standar atau domain kustom tanpa mTLS akan
ditolak dengan 401 Unauthorized.
Jika Anda memanggil layanan yang menerapkan binding sertifikat melalui endpoint non-mTLS (seperti URL *.run.app standar), atau jika Anda tidak memerlukan binding sertifikat untuk endpoint target, teruskan IdTokenProvider.Option.DISABLE_BOUND_ID_TOKEN untuk meminta token ID yang tidak terikat hanya untuk target tersebut:
GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
IdTokenCredentials idTokenCredentials =
IdTokenCredentials.newBuilder()
.setIdTokenProvider((IdTokenProvider) credentials)
.setTargetAudience("https://my-service-12345.us-central1.run.app")
.setOptions(Arrays.asList(IdTokenProvider.Option.DISABLE_BOUND_ID_TOKEN))
.build();
Token akses dan token ID untuk target lain masih terikat. Opsi ini
hanya didukung oleh ComputeEngineCredentials; implementasi IdTokenProvider
lainnya tidak meminta token ID terikat dan mengabaikan opsi ini, sehingga
kode yang sama juga berfungsi di luar lingkungan identitas agen.
Batasan umum
- Agent Development Kit (ADK) untuk Java tidak menggunakan mTLS saat memanggil Google API, seperti Gemini di Vertex AI. Dengan token terikat (default), panggilan tersebut akan gagal dengan
com.google.genai.errors.ClientException: 401 . Request had invalid authentication credentials. Untuk mengatasi masalah ini, tetapkanGOOGLE_API_ENABLE_RUNTIME_BOUND_TOKEN=falseuntuk agen yang menggunakan ADK untuk Java. Untuk mengetahui informasi selengkapnya, lihat Mengautentikasi agen di Cloud Run.
Workload Identity Federation
Workload Identity Federation memungkinkan aplikasi Anda mengakses resource Google Cloud dari Amazon Web Services (AWS), Microsoft Azure, atau penyedia identitas apa pun yang mendukung OpenID Connect (OIDC).
Secara konvensional, aplikasi yang berjalan di luar Google Cloud telah menggunakan kunci akun layanan untuk mengakses resource Google Cloud . Dengan menggunakan workload identity federation, workload Anda dapat meniru akun layanan. Hal ini memungkinkan workload eksternal mengakses resource Google Cloud secara langsung, sehingga menghilangkan beban pemeliharaan dan keamanan yang terkait dengan kunci akun layanan.
Mengakses resource dari AWS
Untuk mengakses resource Google Cloud dari Amazon Web Services (AWS), Anda harus mengonfigurasi workload identity federation terlebih dahulu. Proses penyiapan dijelaskan secara mendetail di Mengakses resource dari AWS.
Sebagai bagian dari proses tersebut, Anda akan membuat file konfigurasi kredensial. File ini berisi metadata yang tidak sensitif yang menginstruksikan library cara mengambil token subjek eksternal dan menukarnya dengan token akses akun layanan. Anda dapat membuat file menggunakan Google Cloud CLI:
# Generate an AWS configuration file.
gcloud iam workload-identity-pools create-cred-config \
projects/<var>PROJECT_NUMBER</var>/locations/global/workloadIdentityPools/<var>POOL_ID</var>/providers/<var>AWS_PROVIDER_ID</var> \
--service-account <var>SERVICE_ACCOUNT_EMAIL</var> \
--aws \
--output-file /path/to/generated/config.json
Ganti kode berikut:
PROJECT_NUMBER: nomor project Google Cloud .POOL_ID: ID workload identity pool.AWS_PROVIDER_ID: ID penyedia AWS.SERVICE_ACCOUNT_EMAIL: email akun layanan yang akan ditiru identitasnya.
Contoh ini menghasilkan file konfigurasi dalam file output yang ditentukan.
Jika Anda menggunakan AWS IMDSv2
, Anda perlu menambahkan flag tambahan --enable-imdsv2 ke
perintah gcloud iam workload-identity-pools create-cred-config:
gcloud iam workload-identity-pools create-cred-config \
projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/AWS_PROVIDER_ID \
--service-account SERVICE_ACCOUNT_EMAIL \
--aws \
--output-file /path/to/generated/config.json \
--enable-imdsv2
Sekarang Anda dapat menggunakan library Auth untuk memanggil resourceGoogle Cloud dari AWS.
Mengakses resource dari Microsoft Azure
Untuk mengakses resource Google Cloud dari Microsoft Azure, Anda harus mengonfigurasi workload identity federation terlebih dahulu. Proses penyiapan dijelaskan secara mendetail di Mengakses resource dari Azure.
Sebagai bagian dari proses tersebut, Anda akan membuat file konfigurasi kredensial. File ini berisi metadata tidak sensitif yang menginstruksikan library cara mengambil token subjek eksternal dan menukarnya dengan token akses akun layanan. Anda dapat membuat file menggunakan Google Cloud CLI:
# Generate an Azure configuration file.
gcloud iam workload-identity-pools create-cred-config \
projects/<var>PROJECT_NUMBER</var>/locations/global/workloadIdentityPools/<var>POOL_ID</var>/providers/<var>AZURE_PROVIDER_ID</var> \
--service-account <var>SERVICE_ACCOUNT_EMAIL</var> \
--azure \
--output-file /path/to/generated/config.json
Ganti kode berikut:
PROJECT_NUMBER: nomor project Google Cloud .POOL_ID: ID workload identity pool.AZURE_PROVIDER_ID: ID penyedia Azure.SERVICE_ACCOUNT_EMAIL: email akun layanan yang akan ditiru identitasnya.
Perintah ini akan membuat file konfigurasi di file output yang ditentukan.
Anda kini dapat menggunakan library Auth untuk memanggil resource Google Clouddari Azure.
Mengakses resource dari penyedia identitas OIDC
Untuk mengakses resource Google Cloud dari penyedia identitas yang mendukung OpenID Connect (OIDC), Anda harus mengonfigurasi workload identity federation terlebih dahulu seperti yang dijelaskan dalam Mengonfigurasi workload identity federation dari penyedia identitas OIDC.
Sebagai bagian dari proses tersebut, Anda akan membuat file konfigurasi kredensial menggunakan Google Cloud CLI. File ini berisi metadata yang tidak sensitif yang menginstruksikan library cara mengambil token subjek eksternal dan menukarnya dengan token akses akun layanan.
Untuk penyedia OIDC, library Auth dapat mengambil token OIDC dari file lokal (kredensial dari file), server lokal (kredensial dari URL), atau kombinasi sertifikat X.509 dan kunci pribadi (kredensial dari sertifikat X.509).
Kredensial dari file
Untuk kredensial yang bersumber dari file, proses latar belakang harus terus-menerus memperbarui lokasi file dengan token OIDC baru sebelum masa berlakunya habis. Untuk token dengan masa berlaku satu jam, Anda harus memperbarui token dalam file setiap jam. Anda dapat menyimpan token secara langsung sebagai teks biasa atau dalam format JSON.
Untuk membuat konfigurasi OIDC dari file, jalankan perintah berikut:
# Generate an OIDC configuration file for file-sourced credentials.
gcloud iam workload-identity-pools create-cred-config \
projects/<var>PROJECT_NUMBER</var>/locations/global/workloadIdentityPools/<var>POOL_ID</var>/providers/<var>OIDC_PROVIDER_ID</var> \
--service-account <var>SERVICE_ACCOUNT_EMAIL</var> \
--credential-source-file <var>PATH_TO_OIDC_ID_TOKEN</var> \
# Optional arguments for file types. Default is "text":
# --credential-source-type "json" \
# Optional argument for the field that contains the OIDC credential.
# This is required for json.
# --credential-source-field-name "id_token" \
--output-file /path/to/generated/config.json
Ganti kode berikut:
PROJECT_NUMBER: nomor project Google Cloud .POOL_ID: ID workload identity pool.OIDC_PROVIDER_ID: ID penyedia OIDC.SERVICE_ACCOUNT_EMAIL: email akun layanan yang akan ditiru identitasnya.PATH_TO_OIDC_ID_TOKEN: jalur yang digunakan untuk mengambil token OIDC.
Perintah ini akan menghasilkan file konfigurasi dalam file output yang ditentukan.
Kredensial dari URL
Untuk kredensial dari URL, server lokal harus menghosting endpoint GET yang menyediakan token OIDC dalam format teks biasa atau JSON. Anda dapat menentukan header HTTP tambahan untuk dikirim dalam permintaan token, jika diperlukan oleh endpoint.
Untuk membuat konfigurasi workload identity OIDC dari URL, jalankan perintah berikut:
# Generate an OIDC configuration file for URL-sourced credentials.
gcloud iam workload-identity-pools create-cred-config \
projects/<var>PROJECT_NUMBER</var>/locations/global/workloadIdentityPools/<var>POOL_ID</var>/providers/<var>OIDC_PROVIDER_ID</var> \
--service-account <var>SERVICE_ACCOUNT_EMAIL</var> \
--credential-source-url <var>URL_TO_GET_OIDC_TOKEN</var> \
--credential-source-headers <var>HEADER_KEY=HEADER_VALUE</var> \
# Optional arguments for file types. Default is "text":
# --credential-source-type "json" \
# Optional argument for the field that contains the OIDC credential.
# This is required for json.
# --credential-source-field-name "id_token" \
--output-file /path/to/generated/config.json
Ganti kode berikut:
PROJECT_NUMBER: nomor project Google Cloud .POOL_ID: ID workload identity pool.OIDC_PROVIDER_ID: ID penyedia OIDC.SERVICE_ACCOUNT_EMAIL: email akun layanan yang akan ditiru identitasnya.URL_TO_GET_OIDC_TOKEN: URL endpoint server lokal yang akan dipanggil untuk mengambil token OIDC.HEADER_KEYdanHEADER_VALUE: pasangan kunci dan nilai header tambahan yang akan diteruskan bersama permintaan GET keURL_TO_GET_OIDC_TOKEN, misalnyaMetadata-Flavor=Google.
Sekarang Anda dapat menggunakan library Auth untuk memanggil resourceGoogle Cloud dari penyedia OIDC.
Mengakses resource menggunakan kredensial yang bersumber dari sertifikat X.509
Untuk kredensial yang bersumber dari sertifikat X.509, library autentikasi menggunakan sertifikat X.509 dan kunci pribadi untuk membuktikan identitas aplikasi Anda. Sertifikat X.509 menyertakan tanggal habis masa berlaku dan harus diperpanjang sebelum masa berlakunya habis untuk mempertahankan akses.
Untuk mengetahui informasi selengkapnya, lihat dokumentasi resmi.
Membuat file konfigurasi untuk penggabungan X.509
Untuk mengonfigurasi kredensial yang bersumber dari sertifikat X.509, Anda membuat dua file terpisah: file konfigurasi kredensial utama dan file konfigurasi sertifikat.
- File konfigurasi kredensial utama berisi metadata yang diperlukan untuk autentikasi. File ini juga mereferensikan file konfigurasi sertifikat.
- File konfigurasi sertifikat menentukan jalur file untuk sertifikat X.509, kunci pribadi, dan rantai kepercayaan.
Perintah gcloud iam workload-identity-pools create-cred-config
dapat digunakan untuk membuat keduanya.
Lokasi tempat gcloud membuat file konfigurasi sertifikat bergantung pada apakah Anda menggunakan flag --credential-cert-configuration-output-file.
Perilaku default (direkomendasikan)
Jika Anda menghilangkan flag --credential-cert-configuration-output-file, gcloud akan membuat file konfigurasi sertifikat di lokasi default yang umum dan dapat ditemukan secara otomatis oleh library Auth. Pendekatan ini cocok untuk sebagian besar kasus penggunaan. File konfigurasi kredensial default diberi nama
config.json dan file konfigurasi sertifikat default diberi nama
certificate_config.json.
Misalnya, jalankan perintah berikut untuk membuat file konfigurasi menggunakan perilaku default:
gcloud iam workload-identity-pools create-cred-config \
projects/<var>PROJECT_NUMBER</var>/locations/global/workloadIdentityPools/<var>POOL_ID</var>/providers/<var>PROVIDER_ID</var> \
--service-account <var>SERVICE_ACCOUNT_EMAIL</var> \
--credential-cert-path "<var>PATH_TO_CERTIFICATE</var>" \
--credential-cert-private-key-path "<var>PATH_TO_PRIVATE_KEY</var>" \
--credential-cert-trust-chain-path "<var>PATH_TO_TRUST_CHAIN</var>" \
--output-file /path/to/config.json
Ganti kode berikut:
PROJECT_NUMBER: nomor project Google Cloud .POOL_ID: ID workload identity pool.PROVIDER_ID: ID penyedia.SERVICE_ACCOUNT_EMAIL: email akun layanan yang akan ditiru identitasnya.PATH_TO_CERTIFICATE: jalur tempat sertifikat X.509 leaf Anda berada.PATH_TO_PRIVATE_KEY: jalur tempat kunci pribadi yang sesuai untuk sertifikat entitas akhir berada.PATH_TO_TRUST_CHAIN: jalur file rantai kepercayaan sertifikat X.509. File ini harus berupa file berformat PEM yang berisi sertifikat perantara yang diperlukan untuk menyelesaikan rantai kepercayaan antara sertifikat entitas akhir dan trust store yang dikonfigurasi di Workload Identity Federation pool. Sertifikat entitas akhir bersifat opsional dalam file ini.
Perintah ini akan menghasilkan hal berikut:
/path/to/config.json: Dibuat di jalur yang Anda tentukan. File ini akan berisi"use_default_certificate_config": trueuntuk menginstruksikan klien agar mencari konfigurasi sertifikat di jalur default.certificate_config.json: Dibuat di jalur konfigurasi Google Cloud CLI default, yang biasanya berupa~/.config/gcloud/certificate_config.jsondi Linux dan macOS, atau%APPDATA%\gcloud\certificate_config.jsondi Windows.
Perilaku lokasi kustom
Jika Anda perlu menyimpan file konfigurasi sertifikat di lokasi non-default, gunakan flag --credential-cert-configuration-output-file.
Contoh perintah (lokasi kustom):
gcloud iam workload-identity-pools create-cred-config \
projects/<var>PROJECT_NUMBER</var>/locations/global/workloadIdentityPools/<var>POOL_ID</var>/providers/<var>PROVIDER_ID</var> \
--service-account <var>SERVICE_ACCOUNT_EMAIL</var> \
--credential-cert-path "<var>PATH_TO_CERTIFICATE</var>" \
--credential-cert-private-key-path "<var>PATH_TO_PRIVATE_KEY</var>" \
--credential-cert-trust-chain-path "<var>PATH_TO_TRUST_CHAIN</var>" \
--credential-cert-configuration-output-file "/custom/path/cert_config.json" \
--output-file /path/to/config.json
Perintah ini menghasilkan:
/path/to/config.json: dibuat di jalur yang Anda tentukan. File ini akan berisi kolom"certificate_config_location"yang mengarah ke jalur kustom Anda.cert_config.json: dibuat di/custom/path/cert_config.json, seperti yang ditentukan oleh flag.
Sekarang Anda dapat menggunakan library Auth untuk memanggil resourceGoogle Cloud dengan kredensial yang bersumber dari sertifikat X.509.
Menggunakan kredensial dari file yang dapat dieksekusi dengan OIDC dan SAML
Untuk kredensial dari file yang dapat dieksekusi, file yang dapat dieksekusi lokal digunakan untuk mengambil
token pihak ketiga. File yang dapat dieksekusi harus memberikan token ID OIDC atau pernyataan SAML yang valid dan belum habis masa berlakunya dalam format JSON ke stdout.
Untuk menggunakan kredensial dari file yang dapat dieksekusi, variabel lingkungan GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES
harus ditetapkan ke 1.
Untuk membuat konfigurasi workload identity dari file yang dapat dieksekusi, jalankan perintah berikut:
# Generate a configuration file for executable-sourced credentials.
gcloud iam workload-identity-pools create-cred-config \
projects/<var>PROJECT_NUMBER</var>/locations/global/workloadIdentityPools/<var>POOL_ID</var>/providers/<var>PROVIDER_ID</var> \
--service-account=<var>SERVICE_ACCOUNT_EMAIL</var> \
--subject-token-type=<var>SUBJECT_TOKEN_TYPE</var> \
# The absolute path for the program, including arguments.
# e.g. --executable-command="/path/to/command --foo=bar"
--executable-command=<var>EXECUTABLE_COMMAND</var> \
# Optional argument for the executable timeout. Defaults to 30s.
# --executable-timeout-millis=<var>EXECUTABLE_TIMEOUT</var> \
# Optional argument for the absolute path to the executable output file.
# See below on how this argument impacts the library behaviour.
# --executable-output-file=<var>EXECUTABLE_OUTPUT_FILE</var> \
--output-file /path/to/generated/config.json
Ganti kode berikut:
PROJECT_NUMBER: nomor project Google Cloud .POOL_ID: ID workload identity pool.PROVIDER_ID: ID penyedia OIDC atau SAML.SERVICE_ACCOUNT_EMAIL: email akun layanan yang akan ditiru identitasnya.SUBJECT_TOKEN_TYPE: jenis token subjek.EXECUTABLE_COMMAND: perintah lengkap yang akan dijalankan, termasuk argumen. Harus berupa jalur absolut ke program.
Flag --executable-timeout-millis bersifat opsional; flag ini menentukan durasi (dalam milidetik) library Auth akan menunggu file yang dapat dieksekusi selesai. Jika tidak diberikan, nilai defaultnya adalah 30 detik. Nilai maksimum yang diizinkan
adalah dua menit, dan minimumnya adalah lima detik.
Flag --executable-output-file opsional menentukan jalur untuk meng-cache
respons kredensial pihak ketiga dari file yang dapat dieksekusi. Caching membantu meningkatkan performa
karena library autentikasi akan memeriksa file ini terlebih dahulu untuk menemukan kredensial yang valid dan belum habis masa berlakunya
sebelum menjalankan file yang dapat dieksekusi. Jika kredensial yang valid dan di-cache ada,
library akan menggunakannya, sehingga menghindari eksekusi file yang tidak perlu.
File yang dapat dieksekusi harus menulis respons kredensial ke file ini. Library autentikasi hanya membaca dari lokasi ini. Konten file harus sesuai dengan format JSON yang diharapkan.
Untuk mengambil token pihak ketiga, library akan menjalankan file yang dapat dieksekusi
menggunakan perintah yang ditentukan. Output file yang dapat dieksekusi harus mematuhi format respons yang ditentukan dalam contoh berikut, dan harus menghasilkan respons ke stdout.
Berikut adalah contoh respons OIDC yang dapat dieksekusi dan berhasil:
{
"version": 1,
"success": true,
"token_type": "urn:ietf:params:oauth:token-type:id_token",
"id_token": "HEADER.PAYLOAD.SIGNATURE",
"expiration_time": 1620499962
}
Berikut adalah contoh respons SAML yang dapat dieksekusi dan berhasil:
{
"version": 1,
"success": true,
"token_type": "urn:ietf:params:oauth:token-type:saml2",
"saml_response": "...",
"expiration_time": 1620499962
}
Saat Anda menentukan file output menggunakan argumen --executable-output-file
dalam konfigurasi kredensial, respons file yang dapat dieksekusi yang berhasil harus menyertakan
kolom expiration_time. Hal ini memungkinkan Library Auth meng-cache dan mengelola validitas kredensial yang disimpan dalam file tersebut secara efektif.
Berikut adalah contoh respons error yang dapat dieksekusi:
{
"version": 1,
"success": false,
"code": "401",
"message": "Caller not authorized."
}
Semua kolom ini wajib diisi untuk respons error. Library menggunakan kolom kode dan pesan sebagai bagian dari pengecualian yang ditampilkan.
Ringkasan kolom format respons:
* version: Versi output JSON. Hanya versi 1 yang didukung.
success: Jika benar, respons harus menyertakan token dan jenis token pihak ketiga. Respons juga harus menyertakan kolom expiration_time jika
file output ditentukan dalam konfigurasi kredensial. File yang dapat dieksekusi juga harus keluar dengan kode keluar 0. Jika salah, respons harus menyertakan kolom kode error dan pesan, serta keluar dengan nilai bukan nol.
: * token_type: Kolom ini menentukan jenis token subjek pihak ketiga. Harus berupa urn:ietf:params:oauth:token-type:jwt, urn:ietf:params:oauth:token-type:id_token, atau urn:ietf:params:oauth:token-type:saml2.
* id_token: Token OIDC pihak ketiga.
* saml_response: Respons SAML pihak ketiga.
expiration_time: Waktu habis masa berlaku token subjek pihak ketiga dalam detik
(waktu epoch Unix).
* code: String kode error.
* message: Pesan error.
Semua jenis respons harus menyertakan kolom version dan success.
* Respons yang berhasil harus menyertakan token_type dan salah satu dari
id_token atau saml_response. Kolom expiration_time juga harus ada jika file output ditentukan dalam konfigurasi kredensial.
* Respons error harus menyertakan kolom code dan message.
Library mengisi variabel lingkungan berikut saat menjalankan file yang dapat dieksekusi:
GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE: kolom audience dari konfigurasi kredensial. Selalu ada.GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE: jenis token subjek yang diharapkan ini. Selalu ada.GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL: Alamat email akun layanan. Hanya ada jika peniruan akun layanan digunakan.GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE: Lokasi file output dari konfigurasi kredensial. Hanya ada jika ditentukan dalam konfigurasi kredensial.
Variabel lingkungan ini dapat digunakan oleh file yang dapat dieksekusi untuk menghindari hard code nilai-nilai ini.
Pertimbangan keamanan
Praktik keamanan berikut direkomendasikan:
- Cegah proses berbahaya menjalankan file yang dapat dieksekusi karena akan menghasilkan kredensial sensitif ke proses tersebut dan penggunanya melalui
stdout. - Mencegah proses berbahaya mengubah konfigurasi atau pemanggilan file yang dapat dieksekusi.
Karena kompleksitas penggunaan kredensial yang bersumber dari file yang dapat dieksekusi, sebaiknya Anda menggunakan mekanisme lain yang didukung, seperti sumber file atau URL, untuk memberikan kredensial pihak ketiga, kecuali jika kredensial tersebut tidak memenuhi persyaratan khusus Anda.
Sekarang Anda dapat menggunakan library Auth untuk memanggil resourceGoogle Cloud dari penyedia OIDC atau SAML.
Menggunakan pemasok kustom dengan OIDC dan SAML
Implementasi kustom IdentityPoolSubjectTokenSupplier dapat digunakan saat
membangun IdentityPoolCredentials untuk menyediakan token subjek yang dapat
ditukar dengan token akses Google Cloud . Pemasok harus menampilkan token subjek yang valid dan belum habis masa berlakunya saat dipanggil oleh kredensial Google Cloud.
IdentityPoolCredentials tidak meng-cache token yang ditampilkan, jadi terapkan logika caching di penyedia token untuk mencegah beberapa permintaan untuk token subjek yang sama.
import java.io.IOException;
public class CustomTokenSupplier implements IdentityPoolSubjectTokenSupplier {
@Override
public String getSubjectToken(ExternalAccountSupplierContext context) throws IOException {
// Any call to the supplier passes a context object with the requested
// audience and subject token type.
string audience = context.getAudience();
string tokenType = context.getSubjectTokenType();
try {
// Return a valid, unexpired token for the requested audience and token type.
// Note that IdentityPoolCredentials don't cache the subject token so
// any caching logic needs to be implemented in the token supplier.
return retrieveToken(audience, tokenType);
} catch (Exception e) {
// If token is unavailable, throw IOException.
throw new IOException(e);
}
}
private String retrieveToken(string tokenType, string audience) {
// Retrieve a subject token of the requested type for the requested audience.
}
}
CustomTokenSupplier tokenSupplier = new CustomTokenSupplier();
IdentityPoolCredentials identityPoolCredentials =
IdentityPoolCredentials.newBuilder()
.setSubjectTokenSupplier(tokenSupplier) // Sets the token supplier.
.setAudience(...) // Sets the Google Cloud audience.
.setSubjectTokenType(SubjectTokenTypes.JWT) // Sets the subject token type.
.build();
Dengan audiens:
//iam.googleapis.com/projects/<var>PROJECT_NUMBER</var>/locations/global/workloadIdentityPools/<var>WORKLOAD_POOL_ID</var>/providers/<var>PROVIDER_ID</var>
Ganti kode berikut:
PROJECT_NUMBER: nomor project Google Cloud .WORKLOAD_POOL_ID: ID workload identity pool.PROVIDER_ID: ID penyedia.
Anda juga dapat menemukan nilai untuk audiens, URL peniruan akun layanan, dan kolom builder lainnya dengan membuat file konfigurasi kredensial dengan gcloud CLI.
Menggunakan pemasok kustom dengan AWS
Implementasi kustom AwsSecurityCredentialsSupplier dapat diberikan saat
melakukan inisialisasi AwsCredentials. Jika disediakan, instance AwsCredentials akan
menyerahkan kepada pemasok untuk mengambil kredensial keamanan AWS yang akan ditukarkan dengan
token aksesGoogle Cloud . Pemasok harus menampilkan kredensial keamanan AWS yang valid dan belum habis masa berlakunya saat dipanggil oleh kredensial Google Cloud .
AwsCredentials tidak meng-cache kredensial keamanan atau region AWS yang ditampilkan, jadi
terapkan logika caching di supplier untuk mencegah beberapa permintaan untuk
resource yang sama.
class CustomAwsSupplier implements AwsSecurityCredentialsSupplier {
@Override
AwsSecurityCredentials getAwsSecurityCredentials(ExternalAccountSupplierContext context) throws IOException {
// Any call to the supplier passes a context object with the requested
// audience.
String audience = context.getAudience();
try {
// Return valid, unexpired AWS security credentials for the requested audience.
// Note that AwsCredentials don't cache the AWS security credentials so
// any caching logic needs to be implemented in the credentials' supplier.
return retrieveAwsSecurityCredentials(audience);
} catch (Exception e) {
// If credentials are unavailable, throw IOException.
throw new IOException(e);
}
}
@Override
String getRegion(ExternalAccountSupplierContext context) throws IOException {
try {
// Return a valid AWS region. i.e. "us-east-2".
// Note that AwsCredentials don't cache the region so
// any caching logic needs to be implemented in the credentials' supplier.
return retrieveAwsRegion();
} catch (Exception e) {
// If region is unavailable, throw IOException.
throw new IOException(e);
}
}
private AwsSecurityCredentials retrieveAwsSecurityCredentials(string audience) {
// Retrieve Aws security credentials for the requested audience.
}
private String retrieveAwsRegion() {
// Retrieve current AWS region.
}
}
CustomAwsSupplier awsSupplier = new CustomAwsSupplier();
AwsCredentials credentials = AwsCredentials.newBuilder()
.setSubjectTokenType(SubjectTokenTypes.AWS4) // Sets the subject token type.
.setAudience(...) // Sets the Google Cloud audience.
.setAwsSecurityCredentialsSupplier(supplier) // Sets the supplier.
.build();
Dengan audiens adalah:
//iam.googleapis.com/projects/<var>PROJECT_NUMBER</var>/locations/global/workloadIdentityPools/<var>WORKLOAD_POOL_ID</var>/providers/<var>PROVIDER_ID</var>
Ganti kode berikut:
PROJECT_NUMBER: nomor project Google Cloud .WORKLOAD_POOL_ID: ID workload identity pool.PROVIDER_ID: ID penyedia.
Anda juga dapat menemukan nilai untuk audiens, URL peniruan akun layanan, dan kolom builder lainnya dengan membuat file konfigurasi kredensial dengan gcloud CLI.
Masa berlaku token yang dapat dikonfigurasi
Saat membuat konfigurasi kredensial dengan workload identity federation menggunakan peniruan akun layanan, Anda dapat memberikan argumen opsional untuk mengonfigurasi masa aktif token akses akun layanan.
Untuk membuat konfigurasi dengan masa aktif token yang dapat dikonfigurasi, jalankan perintah berikut (contoh ini menggunakan konfigurasi AWS, tetapi masa aktif token dapat dikonfigurasi untuk semua penyedia workload identity federation):
# Generate an AWS configuration file with configurable token lifetime.
gcloud iam workload-identity-pools create-cred-config \
projects/<var>PROJECT_NUMBER</var>/locations/global/workloadIdentityPools/<var>POOL_ID</var>/providers/<var>AWS_PROVIDER_ID</var> \
--service-account <var>SERVICE_ACCOUNT_EMAIL</var> \
--aws \
--output-file /path/to/generated/config.json \
--service-account-token-lifetime-seconds <var>TOKEN_LIFETIME</var>
Ganti kode berikut:
PROJECT_NUMBER: nomor project Google Cloud .POOL_ID: ID workload identity pool.AWS_PROVIDER_ID: ID penyedia AWS.SERVICE_ACCOUNT_EMAIL: email akun layanan yang akan ditiru identitasnya.TOKEN_LIFETIME: durasi masa aktif yang dipilih dari token akses akun layanan dalam detik.
Flag service-account-token-lifetime-seconds bersifat opsional. Jika tidak diberikan,
flag akan ditetapkan secara default ke satu jam.
Nilai minimum yang diizinkan adalah 600 (10 menit) dan nilai maksimum yang diizinkan adalah
43200 (12 jam).
Jika Anda memerlukan masa aktif lebih dari satu jam, Anda harus menambahkan akun layanan sebagai nilai yang diizinkan di Organization Policy Service yang menerapkan batasan constraints/iam.allowServiceAccountCredentialLifetimeExtension.
Mengonfigurasi masa aktif yang singkat (misalnya, 10 menit) akan menyebabkan library memulai seluruh alur pertukaran token setiap 10 menit. Tindakan ini akan memanggil penyedia token pihak ketiga meskipun token pihak ketiga belum habis masa berlakunya.
Menggunakan kredensial tenaga kerja pengguna yang diberi otorisasi akun eksternal
Kredensial pengguna yang diizinkan akun eksternal memungkinkan Anda login dengan browser web ke akun penyedia identitas eksternal menggunakan gcloud CLI dan membuat konfigurasi untuk digunakan library autentikasi.
Untuk membuat konfigurasi workforce identity pengguna yang diberi otorisasi akun eksternal, jalankan perintah berikut:
gcloud auth application-default login --login-config=LOGIN_CONFIG
Dengan variabel berikut yang perlu diganti:
LOGIN_CONFIG: file konfigurasi login yang dibuat dengan konsol Google Cloud atau gcloud iam workforce-pools create-login-config
Tindakan ini akan membuka alur browser agar Anda dapat login menggunakan penyedia identitas pihak ketiga yang dikonfigurasi. Kemudian, library ini akan menyimpan konfigurasi pengguna yang diizinkan akun eksternal di lokasi ADC yang dikenal.
Library Auth kemudian akan menggunakan token refresh yang disediakan dari konfigurasi untuk membuat dan memperbarui token akses guna memanggil layanan Google Cloud .
Masa berlaku default token refresh adalah satu jam. Setelah itu, Anda perlu membuat konfigurasi baru dari gcloud CLI. Anda dapat mengubah masa aktif dengan mengubah durasi sesi workforce pool, dan Anda dapat menetapkannya hingga 12 jam.
Menggunakan identitas eksternal
Anda dapat menggunakan identitas eksternal dengan Application Default Credentials. Untuk menggunakan
identitas eksternal dengan Kredensial Default Aplikasi, buat file konfigurasi kredensial
JSON untuk identitas eksternal Anda seperti yang dijelaskan di bagian
Workload Identity Federation.
Setelah dibuat, simpan jalur ke file ini dalam variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS.
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/config.json
Library kini dapat memilih jenis klien yang tepat dan melakukan inisialisasi kredensial dari konteks yang disediakan file konfigurasi.
GoogleCredentials googleCredentials = GoogleCredentials.getApplicationDefault();
String projectId = "your-project-id";
String url = "https://storage.googleapis.com/storage/v1/b?project=" + projectId;
HttpCredentialsAdapter credentialsAdapter = new HttpCredentialsAdapter(googleCredentials);
HttpRequestFactory requestFactory = new NetHttpTransport().createRequestFactory(credentialsAdapter);
HttpRequest request = requestFactory.buildGetRequest(new GenericUrl(url));
JsonObjectParser parser = new JsonObjectParser(GsonFactory.getDefaultInstance());
request.setParser(parser);
HttpResponse response = request.execute();
System.out.println(response.parseAsString());
Anda juga dapat melakukan inisialisasi klien akun eksternal secara eksplisit menggunakan file konfigurasi yang dihasilkan.
ExternalAccountCredentials credentials =
ExternalAccountCredentials.fromStream(new FileInputStream("/path/to/credentials.json"));
Pertimbangan keamanan
Library ini tidak melakukan validasi apa pun pada kolom token_url, token_info_url,
atau service_account_impersonation_url dari konfigurasi kredensial.
Sebaiknya jangan gunakan konfigurasi kredensial yang tidak Anda buat dengan gcloud CLI, kecuali jika Anda memverifikasi bahwa kolom URL mengarah ke domain googleapis.com.
Memperkecil cakupan dengan Batas Akses Kredensial
Memperkecil cakupan dengan Batas Akses Kredensial
memungkinkan pembatasan izin Identity and Access Management (IAM) yang dapat digunakan
kredensial yang berlaku singkat untuk Cloud Storage. Hal ini melibatkan pembuatan
CredentialAccessBoundary yang menentukan batasan yang berlaku untuk
token yang dicakupkan lebih rendah. Penggunaan kredensial dengan cakupan yang dipersempit memastikan bahwa token yang sedang dikirim selalu
memiliki hak istimewa terendah. Lihat
Prinsip Hak Istimewa Terendah.
Membuat CredentialAccessBoundary
Batas Akses Kredensial menentukan resource mana yang dapat diakses oleh kredensial yang baru dibuat. Batas ini juga menentukan batas atas pada izin
yang tersedia di setiap resource. Laporan ini mencakup satu atau beberapa
objek AccessBoundaryRule.
Cuplikan berikut menunjukkan cara melakukan inisialisasi CredentialAccessBoundary
dengan satu AccessBoundaryRule. Aturan ini menentukan bahwa token yang diperkecil cakupannya
akan memiliki akses hanya baca ke objek yang dimulai dengan customer-a di bucket
bucket-123.
// Create the AccessBoundaryRule.
String availableResource = "//storage.googleapis.com/projects/_/buckets/bucket-123";
String availablePermission = "inRole:roles/storage.objectViewer";
String expression = "resource.name.startsWith('projects/_/buckets/bucket-123/objects/customer-a')";
CredentialAccessBoundary.AccessBoundaryRule rule =
CredentialAccessBoundary.AccessBoundaryRule.newBuilder()
.setAvailableResource(availableResource)
.addAvailablePermission(availablePermission)
.setAvailabilityCondition(
CredentialAccessBoundary.AccessBoundaryRule.AvailabilityCondition.newBuilder().setExpression(expression).build())
.build();
// Create the CredentialAccessBoundary with the rule.
CredentialAccessBoundary credentialAccessBoundary =
CredentialAccessBoundary.newBuilder().addRule(rule).build();
Pola penggunaan umum
Pola penggunaan umum melibatkan broker token dengan akses yang ditingkatkan. Broker ini menghasilkan kredensial yang diperkecil cakupannya dari kredensial sumber akses yang lebih tinggi. Kemudian, broker token meneruskan token akses jangka pendek yang diperkecil cakupannya ke konsumen token melalui saluran terautentikasi yang aman untuk akses terbatas ke resource Google CloudStorage.
Membuat token yang dipersempit cakupannya
Ada dua cara untuk membuat token yang diperkecil cakupannya menggunakan
CredentialAccessBoundary:
Sisi server (menggunakan
DownscopedCredentials): klien memanggil Security Token Service (STS) setiap kali token dengan cakupan yang diperkecil diperlukan. Hal ini cocok untuk aplikasi yang aturan Batas Akses Kredensialnya jarang berubah atau saat Anda menggunakan kembali satu kredensial yang diperkecil cakupannya berkali-kali. Pertimbangan utamanya adalah setiap perubahan aturan mengharuskan Anda melakukan panggilan baru ke STS. Pendekatan ini tersedia dalam librarygoogle-auth-library-oauth2-httpdan tidak memerlukan dependensi tambahan. Hal ini memudahkan integrasi. Ini adalah pilihan yang baik jika kasus penggunaan Anda tidak memerlukan manfaat khusus dari pendekatan sisi klien.Sisi klien (menggunakan
ClientSideCredentialAccessBoundaryFactory): klien mengambil materi kriptografis satu kali, lalu membuat beberapa token dengan cakupan yang dipersempit secara lokal. Hal ini meminimalkan panggilan ke STS dan lebih efisien saat aturan Batas Akses Kredensial sering berubah, karena klien tidak perlu menghubungi STS untuk setiap perubahan aturan. Hal ini juga lebih efisien untuk aplikasi yang perlu membuat banyak token unik dengan cakupan yang dipersempit. Pendekatan ini tersedia dalam modulgoogle-auth-library-cab-token-generator. Namun, modul ini memiliki serangkaian dependensinya sendiri. Dependensi ini dapat menambah kompleksitas pada project Anda. Pertimbangkan pendekatan ini jika meminimalkan panggilan STS dan membuat banyak token unik adalah fokus utama. Anda juga perlu mengelola dependensi tambahan.
CAB sisi server
Class DownscopedCredentials dapat digunakan untuk menghasilkan token akses yang diturunkan cakupannya dari kredensial sumber dan CredentialAccessBoundary.
// Retrieve the source credentials from ADC.
GoogleCredentials sourceCredentials = GoogleCredentials.getApplicationDefault()
.createScoped("https://www.googleapis.com/auth/cloud-platform");
// Create an Access Boundary Rule which will restrict the downscoped token to having read-only
// access to objects starting with "customer-a" in bucket "bucket-123".
String availableResource = "//storage.googleapis.com/projects/_/buckets/bucket-123";
String availablePermission = "inRole:roles/storage.objectViewer";
String expression = "resource.name.startsWith('projects/_/buckets/bucket-123/objects/customer-a')";
CredentialAccessBoundary.AccessBoundaryRule rule =
CredentialAccessBoundary.AccessBoundaryRule.newBuilder()
.setAvailableResource(availableResource)
.addAvailablePermission(availablePermission)
.setAvailabilityCondition(
new AvailabilityCondition(expression, /* title= */ null, /* description= */ null))
.build();
// Initialize the DownscopedCredentials class.
DownscopedCredentials downscopedCredentials =
DownscopedCredentials.newBuilder()
.setSourceCredential(sourceCredentials)
.setCredentialAccessBoundary(CredentialAccessBoundary.newBuilder().addRule(rule).build())
.build();
// Retrieve the downscoped access token.
// You will need to pass this to the Token Consumer.
AccessToken downscopedAccessToken = downscopedCredentials.refreshAccessToken();
CAB sisi klien
Untuk CAB sisi klien, ClientSideCredentialAccessBoundaryFactory digunakan
dengan kredensial sumber. Setelah melakukan inisialisasi factory, metode generateToken()
dapat dipanggil berulang kali dengan objek CredentialAccessBoundary
yang berbeda untuk membuat beberapa token downscope.
// Retrieve the source credentials from ADC.
GoogleCredentials sourceCredentials = GoogleCredentials.getApplicationDefault()
.createScoped("https://www.googleapis.com/auth/cloud-platform");
// Create an Access Boundary Rule which will restrict the downscoped token to having read-only
// access to objects starting with "customer-a" in bucket "bucket-123".
String availableResource = "//storage.googleapis.com/projects/_/buckets/bucket-123";
String availablePermission = "inRole:roles/storage.objectViewer";
String expression = "resource.name.startsWith('projects/_/buckets/bucket-123/objects/customer-a')";
CredentialAccessBoundary.AccessBoundaryRule rule =
CredentialAccessBoundary.AccessBoundaryRule.newBuilder()
.setAvailableResource(availableResource)
.addAvailablePermission(availablePermission)
.setAvailabilityCondition(
new AvailabilityCondition(expression, /* title= */ null, /* description= */ null))
.build();
// Initialize the ClientSideCredentialAccessBoundaryFactory.
ClientSideCredentialAccessBoundaryFactory factory =
ClientSideCredentialAccessBoundaryFactory.newBuilder()
.setSourceCredential(sourceCredentials)
.build();
// Create the CredentialAccessBoundary with the rule.
CredentialAccessBoundary credentialAccessBoundary =
CredentialAccessBoundary.newBuilder().addRule(rule).build();
// Generate the downscoped access token.
// You will need to pass this to the Token Consumer.
AccessToken downscopedAccessToken = factory.generateToken(credentialAccessBoundary);
Menggunakan token akses yang diperkecil cakupannya
Anda dapat menyiapkan broker token di server dalam jaringan pribadi. Berbagai workload (konsumen token) dalam jaringan yang sama mengirim permintaan yang diautentikasi ke broker tersebut untuk mendapatkan token yang diperkecil cakupannya. Token ini memungkinkan mereka mengakses atau mengubah bucket Storage Google Cloud tertentu.
Broker membuat instance kredensial yang diperkecil cakupannya yang dapat menghasilkan token akses yang diperkecil cakupannya dan berumur singkat. Kemudian, token ini diteruskan ke konsumen token.
Token akses yang diperkecil cakupannya ini dapat digunakan oleh Konsumen Token menggunakan
OAuth2Credentials atau OAuth2CredentialsWithRefresh. Kemudian, Anda dapat menggunakan kredensial ini untuk melakukan inisialisasi instance klien penyimpanan guna mengakses resource Google CloudStorage dengan akses terbatas.
// You can pass an `OAuth2RefreshHandler` to `OAuth2CredentialsWithRefresh` that will allow the
// library to seamlessly handle downscoped token refreshes on expiration.
OAuth2CredentialsWithRefresh.OAuth2RefreshHandler handler =
new OAuth2CredentialsWithRefresh.OAuth2RefreshHandler() {
@Override
public AccessToken refreshAccessToken() {
// Retrieve the token from your Token Broker.
return accessToken;
}
};
// The downscoped token is retrieved from the token broker.
AccessToken downscopedToken = handler.refreshAccessToken();
// Build the OAuth2CredentialsWithRefresh from the downscoped token and pass a refresh handler
// to handle token expiration. Passing the original downscoped token or the expiry here is optional,
// because the refresh_handler will generate the downscoped token on demand.
OAuth2CredentialsWithRefresh credentials =
OAuth2CredentialsWithRefresh.newBuilder()
.setAccessToken(downscopedToken)
.setRefreshHandler(handler)
.build();
// Use the credentials with the Cloud Storage SDK.
StorageOptions options = StorageOptions.newBuilder().setCredentials(credentials).build();
Storage storage = options.getService();
// Call Cloud Storage APIs.
// Because we passed the downscoped credential, we will have limited read-only access to objects
// starting with "customer-a" in bucket "bucket-123".
storage.get(...)
Hanya Cloud Storage yang mendukung Batas Akses Kredensial; layanan Google Cloud lainnya tidak mendukung fitur ini.
Menggunakan kredensial dengan google-http-client
Kredensial yang disediakan oleh com.google.auth:google-auth-library-oauth2-http
dapat digunakan dengan klien berbasis HTTP Google. Klien berbasis HTTP Google
menyediakan HttpCredentialsAdapter yang dapat digunakan sebagai
HttpRequestInitializer, argumen terakhir untuk builder-nya.
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.services.bigquery.Bigquery;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);
Bigquery bq = new Bigquery.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
.setApplicationName(APPLICATION_NAME)
.build();
Memverifikasi Token JWT (Fitur beta)
Untuk memverifikasi token JWT, gunakan class TokenVerifier.
Memverifikasi tanda tangan
Untuk memverifikasi tanda tangan, gunakan TokenVerifier default:
import com.google.api.client.json.webtoken.JsonWebSignature;
import com.google.auth.oauth2.TokenVerifier;
TokenVerifier tokenVerifier = TokenVerifier.newBuilder().build();
try {
JsonWebSignature jsonWebSignature = tokenVerifier.verify(tokenString);
// Optionally, verify additional claims.
if (!"expected-value".equals(jsonWebSignature.getPayload().get("additional-claim"))) {
// Handle custom verification error.
}
} catch (TokenVerifier.VerificationException e) {
// The token is invalid.
}
Menyesuaikan TokenVerifier
Untuk menyesuaikan TokenVerifier, buat instance menggunakan builder-nya:
import com.google.api.client.json.webtoken.JsonWebSignature;
import com.google.auth.oauth2.TokenVerifier;
TokenVerifier tokenVerifier = TokenVerifier.newBuilder()
.setAudience("audience-to-verify")
.setIssuer("issuer-to-verify")
.build();
try {
JsonWebSignature jsonWebSignature = tokenVerifier.verify(tokenString);
// Optionally, verify additional claims.
if (!"expected-value".equals(jsonWebSignature.getPayload().get("additional-claim"))) {
// Handle custom verification error.
}
} catch (TokenVerifier.VerificationException e) {
// The token is invalid.
}
Untuk opsi lainnya, lihat dokumentasi TokenVerifier.Builder.
google-auth-library-credentials
Artefak ini berisi class dasar dan antarmuka untuk kredensial Google:
Credentials: ini adalah class dasar untuk identitas yang diizinkan. Implementasi class ini dapat memberikan otorisasi pada aplikasi Anda.RequestMetadataCallback: ini adalah antarmuka untuk callback yang menerima hasilCredentials.getRequestMetadata(URI, Executor, RequestMetadataCallback)asinkron.ServiceAccountSigner: ini adalah antarmuka untuk penanda tangan akun layanan. Implementasi class ini dapat menandatangani array byte menggunakan kredensial yang terkait dengan Akun Layanan Google.
google-auth-library-appengine
Artefak ini bergantung pada App Engine SDK (appengine-api-1.0-sdk).
Gunakan hanya untuk aplikasi yang berjalan di lingkungan App Engine yang
menggunakan urlfetch. Class AppEngineCredentials memungkinkan Anda mengizinkan aplikasi App Engine dengan instance AppIdentityService.
Penggunaan:
import com.google.appengine.api.appidentity.AppIdentityService;
import com.google.appengine.api.appidentity.AppIdentityServiceFactory;
import com.google.auth.Credentials;
import com.google.auth.appengine.AppEngineCredentials;
AppIdentityService appIdentityService = AppIdentityServiceFactory.getAppIdentityService();
Credentials credentials =
AppEngineCredentials.newBuilder()
.setScopes(...)
.setAppIdentityService(appIdentityService)
.build();
google-auth-library-cab-token-generator
Modul ini menyediakan class ClientSideCredentialAccessBoundaryFactory,
yang memungkinkan pembuatan token yang diperkecil cakupannya di sisi klien untuk Cloud Storage
menggunakan Batas Akses Kredensial. Pendekatan ini sangat berguna untuk aplikasi yang memerlukan perubahan rutin pada aturan Batas Akses Kredensial atau pembuatan banyak token downscoped yang unik, karena pendekatan ini meminimalkan panggilan ke Security Token Service (STS). Untuk contoh penggunaan, lihat bagian CAB sisi klien. Modul ini dilengkapi dengan kumpulan
dependensinya sendiri. Evaluasi apakah manfaat penurunan cakupan sisi klien lebih besar daripada kompleksitas tambahan untuk kasus penggunaan spesifik Anda.