Sistem OAuth 2.0 Google mendukung interaksi server ke server seperti interaksi antara aplikasi web dan layanan Google. Untuk skenario ini, Anda memerlukan akun layanan, yang merupakan akun milik aplikasi Anda, bukan milik pengguna akhir perorangan. Aplikasi Anda memanggil Google API atas nama akun layanan, sehingga pengguna tidak terlibat secara langsung. Skenario ini terkadang disebut "OAuth dua kaki", atau "2LO". (Istilah terkait "OAuth tiga kaki" mengacu pada skenario saat aplikasi Anda memanggil Google API atas nama pengguna akhir, dan terkadang memerlukan izin pengguna.)
Biasanya, aplikasi menggunakan akun layanan saat aplikasi menggunakan Google API untuk menggunakan datanya sendiri, bukan data pengguna. Misalnya, aplikasi yang menggunakan Google Cloud Datastore untuk persistensi data akan menggunakan akun layanan untuk mengautentikasi panggilannya ke Google Cloud Datastore API.
Administrator domain Google Workspace juga dapat memberikan otorisasi tingkat domain kepada akun layanan untuk mengakses data pengguna atas nama pengguna di domain.
Dokumen ini menjelaskan cara aplikasi dapat menyelesaikan alur OAuth 2.0 server ke server dengan menggunakan library klien Google API (direkomendasikan) atau HTTP.
Ringkasan
Untuk mendukung interaksi server-ke-server, buat akun layanan untuk project Anda di API Consoleterlebih dahulu. Jika Anda ingin mengakses data pengguna untuk pengguna di akun Google Workspace, delegasikan akses seluruh domain ke akun layanan.
Kemudian, aplikasi Anda bersiap untuk melakukan panggilan API yang diotorisasi menggunakan kredensial akun layanan untuk meminta token akses dari server autentikasi OAuth 2.0.
Terakhir, aplikasi Anda dapat menggunakan token akses untuk memanggil Google API.
Membuat akun layanan
Kredensial akun layanan mencakup alamat email yang dibuat dan unik serta setidaknya satu pasangan kunci publik/pribadi. Jika delegasi di seluruh domain diaktifkan, client ID juga merupakan bagian dari kredensial akun layanan.
Jika aplikasi Anda berjalan di Google App Engine, akun layanan akan disiapkan secara otomatis saat Anda membuat project.
Jika aplikasi Anda berjalan di Google Compute Engine, akun layanan juga akan otomatis disiapkan saat Anda membuat project, tetapi Anda harus menentukan cakupan yang diperlukan aplikasi saat membuat instance Google Compute Engine. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan instance untuk menggunakan akun layanan.
Jika aplikasi Anda tidak berjalan di Google App Engine atau Google Compute Engine, Anda harus mendapatkan kredensial ini di Google API Console. Untuk membuat kredensial akun layanan, atau untuk melihat kredensial publik yang telah Anda buat, lakukan hal berikut:
First, create a service account:
- Open the Service accounts page.
- If prompted, select a project, or create a new one.
- Click Create service account.
- Under Service account details, type a name, ID, and description for the service account, then click Create and continue.
- Optional: Under Grant this service account access to project, select the IAM roles to grant to the service account.
- Click Continue.
- Optional: Under Grant users access to this service account, add the users or groups that are allowed to use and manage the service account.
- Click Done.
Next, create a service account key:
- Click the email address for the service account you created.
- Click the Keys tab.
- In the Add key drop-down list, select Create new key.
- Click Create.
Your new public/private key pair is generated and downloaded to your machine; it serves as the only copy of the private key. You are responsible for storing it securely. If you lose this key pair, you will need to generate a new one.
Anda dapat kembali ke API Console kapan saja untuk melihat alamat email, sidik jari kunci publik, dan informasi lainnya, atau untuk membuat pasangan kunci publik/pribadi tambahan. Untuk mengetahui detail selengkapnya tentang kredensial akun layanan di API Console, lihat Akun layanan dalam file bantuan API Console.
Catat alamat email akun layanan dan simpan file kunci pribadi akun layanan di lokasi yang dapat diakses oleh aplikasi Anda. Aplikasi Anda memerlukannya untuk melakukan panggilan API yang diotorisasi.
Mendelegasikan otoritas seluruh domain ke akun layanan
Dengan menggunakan akun Google Workspace, administrator Workspace organisasi dapat memberikan otorisasi kepada aplikasi untuk mengakses data pengguna Workspace atas nama pengguna di domain Google Workspace. Misalnya, aplikasi yang menggunakan Google Calendar API untuk menambahkan acara ke kalender semua pengguna dalam domain Google Workspace akan menggunakan akun layanan untuk mengakses Google Calendar API atas nama pengguna. Memberikan akun layanan otorisasi untuk mengakses data atas nama pengguna di suatu domain terkadang disebut sebagai "mendelegasikan otoritas seluruh domain" ke akun layanan.
Untuk mendelegasikan otorisasi seluruh domain ke akun layanan, administrator super domain Google Workspace harus menyelesaikan langkah-langkah berikut:
- Dari konsol Admin domain Google Workspace, buka Menu utama > Keamanan > Kontrol data dan akses > Kontrol API.
- Di panel Delegasi tingkat domain, pilih Kelola Delegasi Tingkat Domain.
- Klik Tambahkan baru.
- Di kolom Client ID, masukkan Client ID akun layanan. Anda dapat menemukan client ID akun layanan di Service accounts page.
- Di kolom Cakupan OAuth (dipisahkan koma), masukkan daftar cakupan yang harus diberikan aksesnya kepada aplikasi Anda. Misalnya, jika aplikasi Anda memerlukan akses penuh tingkat domain ke Google Drive API dan Google Calendar API, masukkan: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar.
- Klik Authorize.
Aplikasi Anda kini memiliki otorisasi untuk melakukan panggilan API sebagai pengguna di domain Workspace Anda (untuk "meniru identitas" pengguna). Saat bersiap untuk melakukan panggilan API yang didelegasikan ini, Anda akan secara eksplisit menentukan pengguna yang akan disamarkan.
Bersiap untuk melakukan panggilan API yang didelegasikan
Java
Setelah Anda mendapatkan alamat email klien dan kunci pribadi dari API Console, gunakan Library Klien Google API untuk Java untuk membuat objek GoogleCredential
dari kredensial akun layanan dan cakupan yang diperlukan aplikasi Anda. Contoh:
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.services.sqladmin.SQLAdminScopes; // ... GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json")) .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN));
Jika Anda mengembangkan aplikasi di Google Cloud Platform, Anda dapat menggunakan kredensial default aplikasi, yang dapat menyederhanakan prosesnya.
Mendelegasikan otoritas di seluruh domain
Jika Anda telah mendelegasikan akses seluruh domain ke akun layanan dan ingin meniru akun pengguna, tentukan alamat email akun pengguna dengan metode createDelegated
dari objek GoogleCredential
. Contoh:
GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json")) .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN)) .createDelegated("workspace-user@example.com");
Kode di atas menggunakan objek GoogleCredential
untuk memanggil metode createDelegated()
-nya. Argumen untuk metode createDelegated()
harus berupa pengguna yang merupakan bagian dari akun Workspace Anda. Kode Anda yang membuat permintaan akan menggunakan kredensial ini untuk memanggil Google API menggunakan akun layanan Anda.
Python
Setelah Anda mendapatkan alamat email klien dan kunci pribadi dari API Console, gunakan Library Klien Google API untuk Python untuk menyelesaikan langkah-langkah berikut:
- Buat objek
Credentials
dari kredensial akun layanan dan cakupan yang memerlukan akses aplikasi Anda. Contoh:from google.oauth2 import service_account SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin'] SERVICE_ACCOUNT_FILE = '/path/to/service.json' credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES)
Jika Anda mengembangkan aplikasi di Google Cloud Platform, Anda dapat menggunakan kredensial default aplikasi, yang dapat menyederhanakan prosesnya.
- Mendelegasikan otoritas di seluruh domain
Jika Anda telah mendelegasikan akses seluruh domain ke akun layanan dan ingin meniru identitas akun pengguna, gunakan metode
with_subject
dari objekServiceAccountCredentials
yang ada. Contoh:delegated_credentials = credentials.with_subject('user@example.org')
Gunakan objek Kredensial untuk memanggil Google API di aplikasi Anda.
HTTP/REST
Setelah Anda mendapatkan client ID dan kunci pribadi dari API Console, aplikasi Anda harus menyelesaikan langkah-langkah berikut:
- Buat Token Web JSON (JWT, diucapkan "jot") yang menyertakan header, kumpulan klaim, dan tanda tangan.
- Minta token akses dari Server Otorisasi OAuth 2.0 Google.
- Menangani respons JSON yang ditampilkan Server Otorisasi.
Bagian berikut menjelaskan cara menyelesaikan langkah-langkah ini.
Jika respons menyertakan token akses, Anda dapat menggunakan token akses untuk memanggil Google API. (Jika respons tidak menyertakan token akses, permintaan JWT dan token Anda mungkin tidak dibuat dengan benar, atau akun layanan mungkin tidak memiliki izin untuk mengakses cakupan yang diminta.)
Saat masa berlaku token akses berakhir, aplikasi Anda akan membuat JWT lain, menandatanganinya, dan meminta token akses lain.
Bagian lainnya dalam bagian ini menjelaskan detail pembuatan JWT, menandatangani JWT, membentuk permintaan token akses, dan menangani respons.
Membuat JWT
JWT terdiri dari tiga bagian: header, kumpulan klaim, dan
tanda tangan. Set header dan klaim adalah objek JSON. Objek JSON ini diserialisasi ke
byte UTF-8, lalu dienkode menggunakan encoding Base64url. Encoding ini memberikan ketahanan
terhadap perubahan encoding karena operasi encoding berulang. Header, kumpulan klaim, dan
tanda tangan digabungkan dengan karakter titik (.
).
JWT disusun sebagai berikut:
{Base64url encoded header}.{Base64url encoded claim set}.{Base64url encoded signature}
String dasar untuk tanda tangan adalah sebagai berikut:
{Base64url encoded header}.{Base64url encoded claim set}
Membentuk header JWT
Header terdiri dari tiga kolom yang menunjukkan algoritma penandatanganan, format pernyataan, dan [ID kunci kunci akun layanan](https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts.keys) yang digunakan untuk menandatangani JWT. Algoritma dan format bersifat wajib, dan setiap kolom hanya memiliki satu nilai. Seiring diperkenalkannya algoritma dan format tambahan, header ini akan berubah sesuai dengan algoritma dan format tersebut. ID kunci bersifat opsional dan jika ID Kunci yang salah ditentukan, GCP akan mencoba semua kunci yang terkait dengan akun layanan untuk memverifikasi token dan menolak token jika tidak ada kunci yang valid yang ditemukan. Google berhak menolak token dengan ID kunci yang salah pada masa mendatang.
Akun layanan mengandalkan algoritma RSA SHA-256 dan format token JWT. Akibatnya, representasi JSON header adalah sebagai berikut:
{"alg":"RS256","typ":"JWT", "kid":"370ab79b4513eb9bad7c9bd16a95cb76b5b2a56a"}
Representasi Base64url untuk hal ini adalah sebagai berikut:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsICJraWQiOiIzNzBhYjc5YjQ1MTNlYjliYWQ3YzliZDE2YTk1Y2I3NmI1YjJhNTZhIn0=
Membentuk kumpulan klaim JWT
Kumpulan klaim JWT berisi informasi tentang JWT, termasuk izin yang diminta (cakupan), target token, penerbit, waktu token dikeluarkan, dan masa aktif token. Sebagian besar kolom wajib diisi. Seperti header JWT, kumpulan klaim JWT adalah objek JSON dan digunakan dalam penghitungan tanda tangan.
Klaim yang diperlukan
Klaim yang diperlukan dalam kumpulan klaim JWT ditampilkan di bawah. Keduanya dapat muncul dalam urutan apa pun dalam kumpulan klaim.
Nama | Deskripsi |
---|---|
iss |
Alamat email akun layanan. |
scope |
Daftar izin yang diminta aplikasi yang dipisahkan spasi. |
aud |
Deskripsi target pernyataan yang diinginkan. Saat membuat permintaan token akses, nilai ini selalu https://oauth2.googleapis.com/token . |
exp |
Waktu habis masa berlaku pernyataan, yang ditentukan sebagai detik sejak 00.00.00 UTC, 1 Januari 1970. Nilai ini memiliki maksimum 1 jam setelah waktu yang dikeluarkan. |
iat |
Waktu pernyataan dikeluarkan, yang ditentukan sebagai detik sejak 00.00.00 UTC, 1 Januari 1970. |
Representasi JSON kolom yang diperlukan dalam kumpulan klaim JWT ditampilkan di bawah:
{ "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com", "scope": "https://www.googleapis.com/auth/devstorage.read_only", "aud": "https://oauth2.googleapis.com/token", "exp": 1328554385, "iat": 1328550785 }
Klaim tambahan
Dalam beberapa kasus perusahaan, aplikasi dapat menggunakan delegasi tingkat domain untuk bertindak atas nama pengguna tertentu dalam organisasi. Izin untuk melakukan peniruan identitas jenis ini harus diberikan sebelum aplikasi dapat meniru identitas pengguna, dan biasanya ditangani oleh administrator super. Untuk mengetahui informasi selengkapnya, lihat Mengontrol akses API dengan delegasi tingkat domain.
Untuk mendapatkan token akses yang memberikan akses yang didelegasikan ke resource kepada aplikasi,
sertakan alamat email pengguna dalam klaim JWT yang ditetapkan sebagai nilai
kolom sub
.
Nama | Deskripsi |
---|---|
sub |
Alamat email pengguna yang aksesnya didelegasikan oleh aplikasi. |
Jika aplikasi tidak memiliki izin untuk meniru identitas pengguna, respons terhadap
permintaan token akses yang menyertakan kolom sub
akan berupa
error.
Contoh kumpulan klaim JWT yang menyertakan kolom sub
ditampilkan
di bawah ini:
{ "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com", "sub": "some.user@example.com", "scope": "https://www.googleapis.com/auth/prediction", "aud": "https://oauth2.googleapis.com/token", "exp": 1328554385, "iat": 1328550785 }
Mengenkode kumpulan klaim JWT
Seperti header JWT, kumpulan klaim JWT harus diserialisasi ke UTF-8 dan dienkode Base64url-safe. Berikut adalah contoh representasi JSON dari kumpulan Klaim JWT:
{ "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com", "scope": "https://www.googleapis.com/auth/prediction", "aud": "https://oauth2.googleapis.com/token", "exp": 1328554385, "iat": 1328550785 }
Menghitung tanda tangan
JSON Web Signature (JWS) adalah spesifikasi yang memandu mekanisme pembuatan tanda tangan untuk JWT. Input untuk tanda tangan adalah array byte dari konten berikut:
{Base64url encoded header}.{Base64url encoded claim set}
Algoritma penandatanganan di header JWT harus digunakan saat menghitung tanda tangan. Satu-satunya algoritma penandatanganan yang didukung oleh Server Otorisasi OAuth 2.0 Google adalah RSA yang menggunakan algoritma hashing SHA-256. Hal ini dinyatakan sebagai RS256
di kolom alg
di header JWT.
Tanda tangani representasi UTF-8 input menggunakan SHA256withRSA (juga dikenal sebagai RSASSA-PKCS1-V1_5-SIGN dengan fungsi hash SHA-256) dengan kunci pribadi yang diperoleh dari Google API Console. Output-nya akan berupa array byte.
Tanda tangan kemudian harus dienkode Base64url. Header, kumpulan klaim, dan tanda tangan digabungkan dengan karakter titik (.
). Hasilnya adalah JWT. Ini
harus berupa baris berikut (jeda baris ditambahkan untuk kejelasan):
{Base64url encoded header}. {Base64url encoded claim set}. {Base64url encoded signature}
Berikut adalah contoh JWT sebelum encoding Base64url:
{"alg":"RS256","typ":"JWT"}. { "iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com", "scope":"https://www.googleapis.com/auth/prediction", "aud":"https://oauth2.googleapis.com/token", "exp":1328554385, "iat":1328550785 }. [signature bytes]
Berikut adalah contoh JWT yang telah ditandatangani dan siap untuk dikirim:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92NC90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ.UFUt59SUM2_AW4cRU8Y0BYVQsNTo4n7AFsNrqOpYiICDu37vVt-tw38UKzjmUKtcRsLLjrR3gFW3dNDMx_pL9DVjgVHDdYirtrCekUHOYoa1CMR66nxep5q5cBQ4y4u2kIgSvChCTc9pmLLNoIem-ruCecAJYgI9Ks7pTnW1gkOKs0x3YpiLpzplVHAkkHztaXiJdtpBcY1OXyo6jTQCa3Lk2Q3va1dPkh_d--GU2M5flgd8xNBPYw4vxyt0mP59XZlHMpztZt0soSgObf7G3GXArreF_6tpbFsS3z2t5zkEiHuWJXpzcYr5zWTRPDEHsejeBSG8EgpLDce2380ROQ
Membuat permintaan token akses
Setelah membuat JWT yang ditandatangani, aplikasi dapat menggunakannya untuk meminta token akses.
Permintaan token akses ini adalah permintaan POST
HTTPS, dan isi dienkode URL. URL-nya ditampilkan di bawah ini:
https://oauth2.googleapis.com/token
Parameter berikut diperlukan dalam permintaan POST
HTTPS:
Nama | Deskripsi |
---|---|
grant_type |
Gunakan string berikut, yang dienkode URL sesuai kebutuhan:
urn:ietf:params:oauth:grant-type:jwt-bearer |
assertion |
JWT, termasuk tanda tangan. |
Berikut adalah dump mentah permintaan POST
HTTPS yang digunakan dalam permintaan token akses:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS-6uQV6fGorGKrHf3LIJnyREw9evE-gs2bmMaQI5_UbabvI4k-mQE4kBqtmSpTzxYBL1TCd7Kv5nTZoUC1CmwmWCFqT9RE6D7XSgPUh_jF1qskLa2w0rxMSjwruNKbysgRNctZPln7cqQ
Berikut adalah permintaan yang sama, menggunakan curl
:
curl -d 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.RZVpzWygMLuL-n3GwjW1_yhQhrqDacyvaXkuf8HcJl8EtXYjGjMaW5oiM5cgAaIorrqgYlp4DPF_GuncFqg9uDZrx7pMmCZ_yHfxhSCXru3gbXrZvAIicNQZMFxrEEn4REVuq7DjkTMyCMGCY1dpMa8aWfTQFt3Eh7smLchaZsU ' https://oauth2.googleapis.com/token
Menangani respons
Jika permintaan JWT dan token akses dibuat dengan benar dan akun layanan memiliki izin untuk melakukan operasi, respons JSON dari Server Otorisasi akan menyertakan token akses. Berikut adalah contoh respons:
{ "access_token": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M", "scope": "https://www.googleapis.com/auth/prediction" "token_type": "Bearer", "expires_in": 3600 }
Token akses dapat digunakan kembali selama periode durasi yang ditentukan oleh
nilai expires_in
.
Memanggil Google API
Java
Gunakan objek GoogleCredential
untuk memanggil Google API dengan menyelesaikan
langkah-langkah berikut:
- Buat objek layanan untuk API yang ingin Anda panggil menggunakan objek
GoogleCredential
. Contoh:SQLAdmin sqladmin = new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
- Buat permintaan ke layanan API menggunakan
antarmuka yang disediakan oleh objek layanan.
Misalnya, untuk mencantumkan instance database Cloud SQL dalam project exciting-example-123:
SQLAdmin.Instances.List instances = sqladmin.instances().list("exciting-example-123").execute();
Python
Gunakan objek Credentials
yang diotorisasi untuk memanggil Google API dengan menyelesaikan
langkah-langkah berikut:
- Buat objek layanan untuk API yang ingin Anda panggil. Anda mem-build objek layanan
dengan memanggil fungsi
build
dengan nama dan versi API serta objekCredentials
yang diotorisasi. Misalnya, untuk memanggil Cloud SQL Administration API versi 1beta3:import googleapiclient.discovery sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
- Buat permintaan ke layanan API menggunakan
antarmuka yang disediakan oleh objek layanan.
Misalnya, untuk mencantumkan instance database Cloud SQL dalam project exciting-example-123:
response = sqladmin.instances().list(project='exciting-example-123').execute()
HTTP/REST
Setelah aplikasi Anda mendapatkan token akses, Anda dapat menggunakan token tersebut untuk melakukan panggilan ke Google API atas nama akun layanan atau akun pengguna tertentu jika cakupan akses yang diperlukan oleh API telah diberikan. Untuk melakukannya, sertakan
token akses dalam permintaan ke API dengan menyertakan parameter kueri
access_token
atau nilai Bearer
header HTTP Authorization
. Jika memungkinkan,
header HTTP lebih disarankan karena string kueri cenderung terlihat di log server. Pada umumnya, Anda dapat menggunakan library klien untuk menyiapkan panggilan ke Google API (misalnya, saat memanggil Drive Files API).
Anda dapat mencoba semua Google API dan melihat cakupannya di OAuth 2.0 Playground.
Contoh HTTP GET
Panggilan ke endpoint
drive.files
(Drive Files API) menggunakan header HTTP
Authorization: Bearer
mungkin terlihat seperti berikut. Perhatikan bahwa Anda perlu menentukan token akses Anda sendiri:
GET /drive/v2/files HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
Berikut adalah panggilan ke API yang sama untuk pengguna yang diautentikasi menggunakan parameter string kueri access_token
:
GET https://www.googleapis.com/drive/v2/files?access_token=access_token
Contoh curl
Anda dapat menguji perintah ini dengan aplikasi command line curl
. Berikut adalah
contoh yang menggunakan opsi header HTTP (lebih disukai):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files
Atau, opsi parameter string kueri:
curl https://www.googleapis.com/drive/v2/files?access_token=access_token
Saat masa berlaku token akses berakhir
Masa berlaku token akses yang dikeluarkan oleh Server Otorisasi OAuth 2.0 Google akan berakhir setelah durasi yang diberikan oleh nilai expires_in
. Saat masa berlaku token akses berakhir, aplikasi harus membuat JWT lain, menandatanganinya, dan meminta token akses lain.
Kode error JWT
Kolom error |
Kolom error_description |
Arti | Cara mengatasi |
---|---|---|---|
unauthorized_client |
Unauthorized client or scope in request. |
Jika Anda mencoba menggunakan delegasi tingkat domain, akun layanan tidak diberi otorisasi di konsol Admin domain pengguna. |
Pastikan akun layanan diotorisasi di halaman
Delegasi tingkat domain di konsol Admin untuk pengguna di klaim Meskipun biasanya memerlukan waktu beberapa menit, otorisasi mungkin memerlukan waktu hingga 24 jam untuk diterapkan ke semua pengguna di Akun Google Anda. |
unauthorized_client |
Client is unauthorized to retrieve access tokens using this method, or client not
authorized for any of the scopes requested. |
Akun layanan diotorisasi menggunakan alamat email klien, bukan client ID (numerik) di konsol Admin. | Di halaman Delegasi tingkat domain di konsol Admin, hapus klien, lalu tambahkan kembali dengan ID numerik. |
access_denied |
(nilai apa pun) | Jika Anda menggunakan Delegasi di seluruh domain, satu atau beberapa cakupan yang diminta tidak diberi otorisasi di konsol Admin. |
Pastikan akun layanan diotorisasi di halaman
Delegasi tingkat domain di konsol Admin untuk pengguna di klaim Meskipun biasanya memerlukan waktu beberapa menit, otorisasi mungkin memerlukan waktu hingga 24 jam untuk diterapkan ke semua pengguna di Akun Google Anda. |
admin_policy_enforced |
(nilai apa pun) | Akun Google tidak dapat memberikan otorisasi untuk satu atau beberapa cakupan yang diminta karena kebijakan administrator Google Workspace-nya. |
Lihat artikel bantuan Admin Google Workspace Mengontrol aplikasi pihak ketiga & internal yang mengakses data Google Workspace untuk mengetahui informasi selengkapnya tentang cara administrator dapat membatasi akses ke semua cakupan atau cakupan sensitif dan dibatasi hingga akses diberikan secara eksplisit ke client ID OAuth Anda. |
invalid_client |
(nilai apa pun) |
Klien OAuth atau token JWT tidak valid atau salah dikonfigurasi. Lihat deskripsi error untuk mengetahui detailnya. |
Pastikan token JWT valid dan berisi klaim yang benar. Pastikan klien dan akun layanan OAuth dikonfigurasi dengan benar dan Anda menggunakan alamat email yang benar. Pastikan token JWT sudah benar dan dikeluarkan untuk client ID dalam permintaan. |
invalid_grant |
Not a valid email. |
Pengguna tidak ada. | Pastikan alamat email di klaim (kolom) sub sudah benar. |
invalid_grant |
|
Biasanya, ini berarti waktu sistem lokal tidak benar. Hal ini juga dapat terjadi jika
nilai exp lebih dari 65 menit di masa mendatang dari nilai iat ,
atau nilai exp lebih rendah dari nilai iat . |
Pastikan jam di sistem tempat JWT dibuat sudah benar. Jika perlu, sinkronkan waktu Anda dengan NTP Google. |
invalid_grant |
Invalid JWT Signature. |
Pernyataan JWT ditandatangani dengan kunci pribadi yang tidak terkait dengan akun layanan yang diidentifikasi oleh email klien atau kunci yang digunakan telah dihapus, dinonaktifkan, atau sudah tidak berlaku. Atau, pernyataan JWT mungkin salah dienkode - pernyataan tersebut harus berenkode Base64, tanpa baris baru atau tanda sama dengan padding. |
Dekode kumpulan klaim JWT dan verifikasi kunci yang menandatangani pernyataan terkait dengan akun layanan. Coba gunakan library OAuth yang disediakan Google untuk memastikan JWT dibuat dengan benar. |
invalid_scope |
Invalid OAuth scope or ID token audience provided. |
Tidak ada cakupan yang diminta (daftar cakupan kosong), atau salah satu cakupan yang diminta tidak ada (yaitu tidak valid). |
Pastikan klaim (kolom) Perhatikan bahwa daftar cakupan dalam klaim |
disabled_client |
The OAuth client was disabled. |
Kunci yang digunakan untuk menandatangani pernyataan JWT dinonaktifkan. |
Buka Google API Console, dan di bagian IAM & Admin > Service Accounts, aktifkan akun layanan yang berisi "Key ID" yang digunakan untuk menandatangani pernyataan. |
org_internal |
This client is restricted to users within its organization. |
Client ID OAuth dalam permintaan adalah bagian dari project yang membatasi akses ke Akun Google di Organisasi Google Cloud tertentu. |
Gunakan akun layanan dari organisasi untuk melakukan autentikasi. Konfirmasi konfigurasi jenis pengguna untuk aplikasi OAuth Anda. |
Adendum: Otorisasi akun layanan tanpa OAuth
Dengan beberapa Google API, Anda dapat melakukan panggilan API yang diotorisasi menggunakan JWT yang ditandatangani langsung sebagai token pembawa, bukan token akses OAuth 2.0. Jika memungkinkan, Anda dapat menghindari permintaan jaringan ke server otorisasi Google sebelum melakukan panggilan API.
Jika API yang ingin Anda panggil memiliki definisi layanan yang dipublikasikan di repositori GitHub Google API, Anda dapat melakukan panggilan API yang diotorisasi menggunakan JWT, bukan token akses. Untuk melakukannya:
- Buat akun layanan seperti yang dijelaskan di atas. Pastikan untuk menyimpan file JSON yang Anda dapatkan saat membuat akun.
- Dengan menggunakan library JWT standar, seperti yang ditemukan di jwt.io, buat JWT dengan header dan payload seperti contoh berikut:
{ "alg": "RS256", "typ": "JWT", "kid": "abcdef1234567890" } . { "iss": "123456-compute@developer.gserviceaccount.com", "sub": "123456-compute@developer.gserviceaccount.com", "aud": "https://firestore.googleapis.com/", "iat": 1511900000, "exp": 1511903600 }
- Untuk kolom
kid
di header, tentukan ID kunci pribadi akun layanan Anda. Anda dapat menemukan nilai ini di kolomprivate_key_id
dari file JSON akun layanan. - Untuk kolom
iss
dansub
, tentukan alamat email akun layanan Anda. Anda dapat menemukan nilai ini di kolomclient_email
dari file JSON akun layanan. - Untuk kolom
aud
, tentukan endpoint API. Contoh:https://SERVICE.googleapis.com/
. - Untuk kolom
iat
, tentukan waktu Unix saat ini, dan untuk kolomexp
, tentukan waktu tepat 3.600 detik kemudian, saat JWT akan berakhir masa berlakunya.
Tanda tangani JWT dengan RSA-256 menggunakan kunci pribadi yang ditemukan di file JSON akun layanan Anda.
Contoh:
Java
Menggunakan google-api-java-client dan java-jwt:
GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json")); PrivateKey privateKey = credential.getServiceAccountPrivateKey(); String privateKeyId = credential.getServiceAccountPrivateKeyId(); long now = System.currentTimeMillis(); try { Algorithm algorithm = Algorithm.RSA256(null, privateKey); String signedJwt = JWT.create() .withKeyId(privateKeyId) .withIssuer("123456-compute@developer.gserviceaccount.com") .withSubject("123456-compute@developer.gserviceaccount.com") .withAudience("https://firestore.googleapis.com/") .withIssuedAt(new Date(now)) .withExpiresAt(new Date(now + 3600 * 1000L)) .sign(algorithm); } catch ...
Python
Menggunakan PyJWT:
iat = time.time() exp = iat + 3600 payload = {'iss': '123456-compute@developer.gserviceaccount.com', 'sub': '123456-compute@developer.gserviceaccount.com', 'aud': 'https://firestore.googleapis.com/', 'iat': iat, 'exp': exp} additional_headers = {'kid': PRIVATE_KEY_ID_FROM_JSON} signed_jwt = jwt.encode(payload, PRIVATE_KEY_FROM_JSON, headers=additional_headers, algorithm='RS256')
- Panggil API, menggunakan JWT yang ditandatangani sebagai token pembawa:
GET /v1/projects/abc/databases/123/indexes HTTP/1.1 Authorization: Bearer SIGNED_JWT Host: firestore.googleapis.com
Menerapkan Perlindungan Lintas Akun
Langkah tambahan yang harus Anda lakukan untuk melindungi akun pengguna adalah menerapkan Perlindungan lintas akun dengan memanfaatkan Layanan Perlindungan Lintas Akun Google. Layanan ini memungkinkan Anda berlangganan notifikasi peristiwa keamanan yang memberikan informasi kepada aplikasi tentang perubahan besar pada akun pengguna. Anda kemudian dapat menggunakan informasi tersebut untuk mengambil tindakan, bergantung pada cara Anda memutuskan untuk merespons peristiwa.
Beberapa contoh jenis peristiwa yang dikirim ke aplikasi Anda oleh Layanan Perlindungan Lintas Akun Google adalah:
-
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
-
https://schemas.openid.net/secevent/oauth/event-type/token-revoked
-
https://schemas.openid.net/secevent/risc/event-type/account-disabled
Lihat halaman Melindungi akun pengguna dengan Perlindungan Lintas Akun untuk mengetahui informasi selengkapnya tentang cara menerapkan Perlindungan Lintas Akun dan untuk mengetahui daftar lengkap peristiwa yang tersedia.