Menggunakan OAuth 2.0 untuk Aplikasi Server ke Server

175 Untuk informasi selengkapnya, lihat Ringkasan Autentikasi di dokumentasi Google Cloud Platform.

Sistem Google OAuth 2.0 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 individual. Aplikasi Anda memanggil Google API atas nama akun layanan, sehingga pengguna tidak terlibat secara langsung. Skenario ini terkadang disebut "OAuth berkaki dua," atau "2LO." (Istilah "tiga cabang OAuth" terkait; skenario di mana aplikasi Anda memanggil Google API atas nama pengguna akhir, dan terkadang izin pengguna diperlukan.)

Biasanya, aplikasi menggunakan akun layanan ketika aplikasi menggunakan Google API untuk bekerja dengan 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 kewenangan kepada akun layanan di seluruh domain untuk mengakses data pengguna atas nama pengguna di domain.

Dokumen ini menjelaskan cara aplikasi menyelesaikan alur OAuth 2.0 server ke server dengan menggunakan library klien Google API (direkomendasikan) atau HTTP.

Ringkasan

Untuk mendukung interaksi server ke server, pertama-tama buat akun layanan untuk project Anda di . Jika Anda ingin mengakses data pengguna untuk pengguna di akun Google Workspace, delegasikan akses seluruh domain ke akun layanan.

Kemudian, aplikasi Anda akan bersiap untuk melakukan panggilan API resmi dengan menggunakan kredensial akun layanan untuk meminta token akses dari server autentikasi OAuth 2.0.

Terakhir, aplikasi Anda dapat menggunakan token akses tersebut untuk memanggil Google API.

Membuat akun layanan

Kredensial akun layanan mencakup alamat email yang dibuat yang unik dan minimal satu pasangan kunci publik/pribadi. Jika delegasi tingkat 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 pada Google Compute Engine, akun layanan juga disiapkan secara otomatis saat Anda membuat project, tetapi Anda harus menentukan cakupan yang perlu diakses aplikasi saat Anda 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 . Untuk membuat kredensial akun layanan, atau untuk melihat kredensial publik yang telah Anda buat, lakukan hal berikut:

Pertama, buat akun layanan:

  1. Buka Service accounts page.
  2. If prompted, select a project, or create a new one.
  3. Klik Buat akun layanan.
  4. Di bawah Layanan rincian rekening, ketik nama, ID, dan keterangan untuk account layanan, lalu klik Buat dan lanjutkan.
  5. Opsional: Di bawah Hibah layanan ini akses akun untuk proyek, pilih peran IAM untuk memberikan kepada account layanan.
  6. Klik Lanjutkan.
  7. Opsional: Di bawah Hibah pengguna akses ke akun layanan ini, tambahkan pengguna atau kelompok yang diizinkan untuk menggunakan dan mengelola account layanan.
  8. Klik Selesai.
  9. Klik Buat key, lalu klik Buat.

Selanjutnya, buat kunci akun layanan:

  1. Klik alamat email untuk akun layanan yang Anda buat.
  2. Klik tab Keys.
  3. Dalam kunci Tambah daftar drop-down, pilih Buat kunci baru.
  4. Klik Buat.

Pasangan kunci publik/pribadi baru Anda dibuat dan diunduh ke mesin Anda; itu berfungsi sebagai satu-satunya salinan kunci pribadi. Anda bertanggung jawab untuk menyimpannya dengan aman. Jika Anda kehilangan pasangan kunci ini, Anda harus membuat yang baru.

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 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 semua domain ke akun layanan

Jika Anda memiliki akun Google Workspace, administrator organisasi dapat mengizinkan aplikasi untuk mengakses data pengguna atas nama pengguna di domain Google Workspace. Misalnya, aplikasi yang menggunakan Google Calendar API untuk menambahkan acara ke kalender semua pengguna di domain Google Workspace akan menggunakan akun layanan untuk mengakses Google Calendar API atas nama pengguna. Memberi otorisasi pada akun layanan untuk mengakses data atas nama pengguna di domain terkadang disebut sebagai "mendelegasikan otoritas seluruh domain" ke akun layanan.

Untuk mendelegasikan otoritas tingkat domain ke akun layanan, administrator super domain Google Workspace harus menyelesaikan langkah-langkah berikut:

  1. Dari konsol Admin domain Google Workspace Anda, buka Menu utama > Keamanan > Akses dan kontrol data > Kontrol API.
  2. Di panel Delegasi tingkat domain, pilih Kelola Delegasi Tingkat Domain.
  3. Klik Tambahkan baru.
  4. Di kolom Client ID, masukkan Client ID akun layanan. Anda dapat menemukan client ID akun layanan di Service accounts page.
  5. Pada kolom Cakupan OAuth (dipisahkan koma), masukkan daftar cakupan yang harus diberi akses oleh aplikasi Anda. Misalnya, jika aplikasi Anda memerlukan akses penuh ke seluruh domain ke Google Drive API dan Google Calendar API, masukkan: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar.
  6. Klik Otorisasi.

Aplikasi Anda kini memiliki wewenang untuk melakukan panggilan API sebagai pengguna di domain (untuk "meniru identitas" pengguna). Saat bersiap melakukan panggilan API yang diotorisasi, Anda menentukan pengguna untuk meniru identitas.

Bersiap untuk melakukan panggilan API yang diotorisasi

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 memerlukan akses ke aplikasi Anda. Misalnya:

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.

Delegasikan otoritas seluruh domain

Jika Anda telah mendelegasikan akses seluruh domain ke akun layanan dan ingin meniru identitas akun pengguna, tentukan alamat email akun pengguna dengan metode createDelegated objek GoogleCredential. Contoh:

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .createDelegated("user@example.com");

Gunakan objek GoogleCredential untuk memanggil Google API di aplikasi Anda.

Python

Setelah mendapatkan alamat email klien dan kunci pribadi dari API Console, gunakan Library Klien Google API untuk Python untuk menyelesaikan langkah-langkah berikut:

  1. Buat objek Credentials dari kredensial akun layanan dan cakupan yang perlu diakses oleh 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.

  2. Delegasikan otoritas seluruh domain

    Jika Anda telah mendelegasikan akses seluruh domain ke akun layanan dan ingin meniru identitas akun pengguna, gunakan metode with_subject dari objek ServiceAccountCredentials yang ada. Misalnya:

    delegated_credentials = credentials.with_subject('user@example.org')

Gunakan objek Credentials untuk memanggil Google API dalam aplikasi Anda.

HTTP/REST

Setelah mendapatkan client ID dan kunci pribadi dari API Console, aplikasi Anda harus menyelesaikan langkah-langkah berikut:

  1. Buat Token Web JSON (JWT, diucapkan, "jot") yang mencakup header, kumpulan klaim, dan tanda tangan.
  2. Minta token akses dari Server Otorisasi Google OAuth 2.0.
  3. Menangani respons JSON yang ditampilkan Server Otorisasi.

Bagian selanjutnya menjelaskan cara menyelesaikan langkah-langkah tersebut.

Jika respons menyertakan token akses, Anda dapat menggunakan token akses tersebut untuk memanggil Google API. (Jika respons tidak menyertakan token akses, JWT dan permintaan token Anda mungkin tidak diformat dengan benar, atau akun layanan mungkin tidak memiliki izin untuk mengakses cakupan yang diminta.)

Saat token akses berakhir, aplikasi Anda menghasilkan JWT lain, menandatanganinya, dan meminta token akses lain.

Aplikasi server Anda menggunakan JWT untuk meminta token dari Server Otorisasi Google, lalu menggunakan token tersebut untuk memanggil endpoint Google API. Tidak ada pengguna akhir yang terlibat.

Bagian selanjutnya menjelaskan bagian khusus dalam pembuatan JWT, menandatangani JWT, membentuk permintaan token akses, dan menangani responsnya.

Membuat JWT

JWT terdiri dari tiga bagian: header, kumpulan klaim, dan tanda tangan. Header dan kumpulan klaim adalah objek JSON. Objek JSON ini diserialisasi ke byte UTF-8, kemudian dienkode menggunakan encoding Base64url. Encoding ini memberikan ketahanan terhadap perubahan encoding karena operasi encoding berulang. Header, kumpulan klaim, dan tanda tangan digabung bersama 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 dua kolom yang menunjukkan algoritme penandatanganan dan format pernyataan. Kedua kolom ini wajib diisi, dan setiap kolom hanya memiliki satu nilai. Saat algoritme dan format tambahan diperkenalkan, header ini akan berubah.

Akun layanan mengandalkan algoritme SHA-256 RSA dan format token JWT. Akibatnya, representasi JSON header adalah sebagai berikut:

{"alg":"RS256","typ":"JWT"}

Representasi Base64url untuk hal ini adalah sebagai berikut:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
Membentuk kumpulan klaim JWT

Kumpulan klaim JWT berisi informasi tentang JWT, termasuk izin yang diminta (cakupan), target token, penerbit, waktu token dikeluarkan, dan masa pakai token. Sebagian besar kolom bersifat wajib. 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 ini. Klaim dapat muncul dalam urutan apa pun di klaim yang ditetapkan.

Name Deskripsi
iss Alamat email akun layanan.
scope Daftar izin yang dipisahkan oleh permintaan yang diminta aplikasi.
aud Deskripsi target yang ditargetkan dari pernyataan. Saat membuat token akses, minta nilai ini selalu https://oauth2.googleapis.com/token.
exp Waktu habis masa berlaku pernyataan, ditetapkan sebagai detik sejak 00.00.00 UTC, 1 Januari 1970. Nilai ini memiliki batas maksimum 1 jam setelah waktu yang dikeluarkan.
iat Waktu pernyataan dikeluarkan, yang ditetapkan sebagai detik sejak 00.00.00 UTC, 1 Januari 1970.

Representasi JSON dari kolom wajib diisi dalam kumpulan klaim JWT ditampilkan di bawah ini:

{
  "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 informasi selengkapnya, lihat Mengontrol akses API dengan delegasi tingkat domain.

Untuk mendapatkan token akses yang memberi aplikasi akses yang didelegasikan ke resource, sertakan alamat email pengguna dalam klaim JWT yang ditetapkan sebagai nilai kolom sub.

Name Deskripsi
sub Alamat email pengguna yang diminta aksesnya oleh aplikasi.

Jika aplikasi tidak memiliki izin untuk meniru identitas pengguna, respons terhadap permintaan token akses yang menyertakan kolom sub akan menjadi error.

Contoh kumpulan klaim JWT yang menyertakan kolom sub ditunjukkan 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 encoding UTF-8 dan 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}

Algoritme penandatanganan di header JWT harus digunakan saat menghitung tanda tangan. Satu-satunya algoritme penandatanganan yang didukung oleh Server Otorisasi Google OAuth 2.0 adalah RSA menggunakan algoritme hashing SHA-256. Ini dinyatakan sebagai RS256 di kolom alg di header JWT.

Menandatangani representasi UTF-8 dari 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 dengan Base64url. Header, kumpulan klaim, dan tanda tangan digabung bersama dengan karakter titik (.). Hasilnya adalah JWT. Nilainya harus seperti berikut (jeda baris ditambahkan agar lebih jelas):

{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 ini contoh JWT yang telah ditandatangani dan siap untuk transmisi:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92NC90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ.UFUt59SUM2_AW4cRU8Y0BYVQsNTo4n7AFsNrqOpYiICDu37vVt-tw38UKzjmUKtcRsLLjrR3gFW3dNDMx_pL9DVjgVHDdYirtrCekUHOYoa1CMR66nxep5q5cBQ4y4u2kIgSvChCTc9pmLLNoIem-ruCecAJYgI9Ks7pTnW1gkOKs0x3YpiLpzplVHAkkHztaXiJdtpBcY1OXyo6jTQCa3Lk2Q3va1dPkh_d--GU2M5flgd8xNBPYw4vxyt0mP59XZlHMpztZt0soSgObf7G3GXArreF_6tpbFsS3z2t5zkEiHuWJXpzcYr5zWTRPDEHsejeBSG8EgpLDce2380ROQ

Membuat permintaan token akses

Setelah menghasilkan JWT bertanda tangan, aplikasi dapat menggunakannya untuk meminta token akses. Permintaan token akses ini adalah permintaan POST HTTPS, dan isinya adalah URL yang dienkode. URL-nya ditampilkan di bawah ini:

https://oauth2.googleapis.com/token

Parameter berikut diperlukan dalam permintaan POST HTTPS:

Name Deskripsi
grant_type Gunakan string berikut, yang dienkode URL jika perlu: 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 token akses dan JWT dibuat dengan benar dan akun layanan memiliki izin untuk menjalankan 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:

  1. Buat objek layanan untuk API yang ingin Anda panggil menggunakan objek GoogleCredential. Contoh:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. Buat permintaan ke layanan API menggunakan antarmuka yang disediakan oleh objek layanan. Misalnya, untuk membuat daftar instance database Cloud SQL dalam project contoh-123 yang menarik:
    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:

  1. Buat objek layanan untuk API yang ingin Anda panggil. Anda membuat objek layanan dengan memanggil fungsi build dengan nama dan versi API serta objek Credentials yang diotorisasi. Misalnya, untuk memanggil versi Cloud SQL Administration API versi 1beta3:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. Buat permintaan ke layanan API menggunakan antarmuka yang disediakan oleh objek layanan. Misalnya, untuk membuat daftar instance database Cloud SQL dalam project contoh-123 yang menarik:
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP/REST

Setelah aplikasi Anda memperoleh 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. Dalam sebagian besar kasus, 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 terautentikasi yang 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 Google OAuth 2.0 berakhir setelah durasi yang diberikan oleh nilai expires_in. Jika masa berlaku token akses berakhir, maka aplikasi harus membuat JWT lain, menandatanganinya, dan meminta token akses lainnya.

Kode error JWT

Kolom error Kolom error_description Arti Cara menyelesaikan
unauthorized_client Unauthorized client or scope in request. Jika Anda mencoba menggunakan delegasi tingkat domain, berarti akun layanan tidak diberi otorisasi di konsol Admin domain pengguna.

Pastikan akun layanan diotorisasi di halaman Delegasi tingkat domain di konsol Admin untuk pengguna dalam klaim (kolom) sub.

Meskipun biasanya memerlukan waktu beberapa menit, mungkin diperlukan waktu hingga 24 jam agar otorisasi 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 diizinkan menggunakan alamat email klien, bukan client ID (numerik) di konsol Admin. Pada halaman Delegasi tingkat domain di konsol Admin, hapus klien, lalu tambahkan kembali dengan ID numerik.
access_denied (nilai apa pun) Jika Anda menggunakan delegasi tingkat 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 dalam klaim (kolom) sub, dan mencakup semua cakupan yang Anda minta di klaim scope JWT Anda.

Meskipun biasanya memerlukan waktu beberapa menit, mungkin diperlukan waktu hingga 24 jam agar otorisasi diterapkan ke semua pengguna di Akun Google Anda.

invalid_grant Not a valid email. Pengguna tidak ada. Pastikan alamat email dalam klaim (kolom) sub sudah benar.
invalid_grant

Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your 'iat' and 'exp' values and use a clock with skew to account for clock differences between systems.

Biasanya, hal ini berarti waktu sistem lokal salah. Ini juga dapat terjadi jika nilai exp lebih dari 65 menit mendatang dari nilai iat, atau nilai exp lebih rendah dari nilai iat.

Pastikan jam pada sistem tempat JWT dibuat sudah benar. Jika perlu, sinkronkan waktu Anda dengan Google NTP.

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 telah habis masa berlakunya.

Atau, pernyataan JWT mungkin tidak dienkode dengan benar - yaitu harus dienkode dengan Base64, tanpa tanda 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 scope (kolom) JWT telah diisi, dan bandingkan cakupan yang dimuatnya dengan cakupan yang didokumentasikan untuk API yang ingin Anda gunakan, guna memastikan tidak ada error atau salah ketik.

Perhatikan bahwa daftar cakupan dalam klaim scope harus dipisahkan dengan spasi, bukan koma.

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.

Adendum: Otorisasi akun layanan tanpa OAuth

Dengan beberapa Google API, Anda dapat melakukan panggilan API yang diotorisasi menggunakan JWT yang ditandatangani secara langsung sebagai token pemilik, bukan token akses OAuth 2.0. Jika hal ini memungkinkan, Anda tidak perlu membuat 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:

  1. Buat akun layanan seperti yang dijelaskan di atas. Pastikan untuk menyimpan file JSON yang Anda dapatkan saat membuat akun.
  2. 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 kolom private_key_id pada file JSON akun layanan.
    • Untuk kolom iss dan sub, tentukan alamat email akun layanan Anda. Anda dapat menemukan nilai ini di kolom client_email pada 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 kolom exp, tentukan waktu tepatnya 3.600 detik setelahnya, ketika JWT akan berakhir.

Tanda tangani JWT dengan RSA-256 menggunakan kunci pribadi yang ditemukan dalam file JSON akun layanan Anda.

Misalnya:

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')
  1. Panggil API ini, menggunakan JWT yang ditandatangani sebagai token pemilik:
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com