Menggunakan OAuth 2.0 untuk Aplikasi Server ke Server

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 tahap", atau "2LO". (Istilah terkait "OAuth tiga pihak" mengacu pada skenario saat aplikasi Anda memanggil Google API atas nama pengguna akhir, dan saat izin pengguna terkadang diperlukan.)

Biasanya, aplikasi menggunakan akun layanan saat 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 memberi akun layanan otoritas tingkat domain 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 terlebih dahulu di API Console. Jika Anda ingin mengakses data pengguna untuk pengguna di akun Google Workspace Anda, delegasikan akses seluruh domain ke akun layanan.

Kemudian, aplikasi Anda bersiap untuk melakukan panggilan API yang diotorisasi dengan 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 bersifat unik serta setidaknya 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 di Google Compute Engine, akun layanan juga disiapkan secara otomatis saat Anda membuat project, tetapi Anda harus menentukan cakupan yang diperlukan aplikasi Anda untuk mengakses 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 Google API Console. Untuk membuat kredensial akun layanan, atau untuk melihat kredensial publik yang telah Anda buat, lakukan langkah-langkah 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 Detail akun layanan , ketik nama, ID, dan deskripsi untuk akun layanan, lalu klik Buat dan lanjutkan .
  5. Opsional: Di bagian Berikan akses akun layanan ini ke project , pilih peran IAM untuk diberikan ke akun layanan.
  6. Klik Lanjutkan .
  7. Opsional: Di bawah Beri pengguna akses ke akun layanan ini , tambahkan pengguna atau grup yang diizinkan untuk menggunakan dan mengelola akun layanan.
  8. Klik Selesai .

Selanjutnya, buat kunci akun layanan:

  1. Klik alamat email untuk akun layanan yang Anda buat.
  2. Klik tab Kunci .
  3. Di daftar tarik-turun Tambahkan kunci , 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 dari kunci privat. 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 mengetahui detail selengkapnya tentang kredensial akun layanan di API Console, lihat Akun layanan di 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 tingkat domain ke akun layanan

Dengan menggunakan akun Google Workspace, administrator Workspace organisasi dapat memberikan otorisasi 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 izin seluruh 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 > Kontrol data dan akses > 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 ID klien akun layanan Anda di Service accounts page.
  5. Di kolom Cakupan OAuth (dipisahkan koma), masukkan daftar cakupan yang harus diberikan akses ke 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.
  6. Klik Authorize.

Aplikasi Anda kini memiliki otoritas 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 ditiru.

Bersiap untuk melakukan panggilan API yang didelegasikan

Java

Setelah mendapatkan alamat email klien dan kunci pribadi dari API Console, gunakan Google Auth Library for Java untuk membuat objek GoogleCredentials dari kredensial akun layanan dan cakupan yang perlu diakses aplikasi Anda. Contoh:

import com.google.auth.oauth2.GoogleCredentials;
import com.google.api.services.sqladmin.SQLAdminScopes;

// ...

GoogleCredentials credentials = GoogleCredentials.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 sebagai gantinya, yang dapat menyederhanakan proses.

Mendelegasikan otoritas tingkat 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 dari objek GoogleCredentials. Contoh:

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

Kode di atas menggunakan objek GoogleCredentials untuk memanggil metode createDelegated()-nya. Argumen untuk metode createDelegated() harus berupa pengguna yang termasuk dalam akun Workspace Anda. Kode Anda yang membuat permintaan akan menggunakan kredensial ini untuk memanggil Google API menggunakan akun layanan 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 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 sebagai gantinya, yang dapat menyederhanakan prosesnya.

  2. Mendelegasikan otoritas tingkat 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. Contoh:

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

Gunakan objek Kredensial untuk memanggil Google API di aplikasi Anda.

HTTP/REST

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

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

Bagian berikutnya 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.

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 secara spesifik cara membuat JWT, menandatangani JWT, membentuk permintaan token akses, dan menangani respons.

Membuat JWT

JWT terdiri dari tiga bagian: header, set klaim, dan tanda tangan. Header dan set 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, set 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 dua kolom wajib diisi: algoritma penandatanganan dan format pernyataan, serta ID kunci opsional:

  • Algoritma wajib diisi, dan hanya memiliki satu nilai: "alg": "RS256".
  • Format wajib diisi, dan hanya memiliki satu nilai: "typ": "JWT".
  • ID kunci bersifat opsional, dan merupakan ID kunci akun layanan yang digunakan untuk menandatangani JWT. Jika ID Kunci yang salah ditentukan, semua kunci yang terkait dengan akun layanan akan dicoba. Jika tidak ada kunci yang valid, token akan ditolak. Google berhak menolak token dengan ID kunci yang salah.

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-nya adalah sebagai berikut:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsICJraWQiOiIzNzBhYjc5YjQ1MTNlYjliYWQ3YzliZDE2YTk1Y2I3NmI1YjJhNTZhIn0=
Membentuk kumpulan klaim JWT

Kumpulan klaim JWT berisi informasi tentang JWT, termasuk izin yang diminta (cakupan), target token, penerbit, waktu penerbitan token, dan masa aktif token. Sebagian besar kolom wajib diisi. Seperti header JWT, set klaim JWT adalah objek JSON dan digunakan dalam penghitungan tanda tangan.

Klaim yang diperlukan

Klaim yang diperlukan dalam set klaim JWT ditampilkan di bawah. Entitas tersebut dapat muncul dalam urutan apa pun di set klaim.

Nama Deskripsi
iss Alamat email akun layanan.
scope Daftar izin yang diminta aplikasi, yang dipisahkan dengan spasi.
aud Deskripsi target yang dimaksud dari pernyataan. Saat membuat permintaan token akses, nilai ini selalu https://oauth2.googleapis.com/token.
exp Waktu habis masa berlaku pernyataan, ditentukan sebagai detik sejak 00:00:00 UTC, 1 Januari 1970. Nilai ini memiliki maksimum 1 jam setelah waktu penerbitan.
iat Waktu saat pernyataan dikeluarkan, ditentukan sebagai detik sejak 00.00.00 UTC, 1 Januari 1970.

Representasi JSON dari kolom yang diperlukan dalam set 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 aplikasi ke resource, sertakan alamat email pengguna dalam set klaim JWT sebagai nilai kolom sub.

Nama Deskripsi
sub Alamat email pengguna yang aksesnya didelegasikan diminta oleh aplikasi.

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

Contoh set klaim JWT yang menyertakan kolom sub ditampilkan di bawah:

{
  "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
}
Meng-encode kumpulan klaim JWT

Seperti header JWT, set klaim JWT harus diserialisasi ke UTF-8 dan dienkode Base64url-safe. Di bawah ini adalah contoh representasi JSON dari set 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 menggunakan algoritma hashing SHA-256. Hal ini dinyatakan sebagai RS256 di kolom alg di header JWT.

Tandatangani 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 Base64url. Header, set klaim, dan tanda tangan digabungkan dengan karakter titik (.). Hasilnya adalah JWT. Harus berupa berikut (pemisah 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 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 HTTPS POST, dan isi permintaan dienkode URL. URL 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 HTTPS POST 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 waktu yang ditentukan oleh nilai expires_in.

Memanggil Google API

Java

Gunakan objek GoogleCredentials untuk memanggil Google API dengan menyelesaikan langkah-langkah berikut:

  1. Buat objek layanan untuk API yang ingin Anda panggil menggunakan objek GoogleCredentials. Contoh:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credentials).build();
  2. 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 sah 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 diberi otorisasi. Misalnya, untuk memanggil versi 1beta3 Cloud SQL Administration API:
    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 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 header HTTP Authorization Bearer. Jika memungkinkan, header HTTP lebih disarankan, karena string kueri cenderung terlihat dalam 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 drive.files endpoint (Drive Files API) menggunakan header HTTP Authorization: Bearer mungkin terlihat seperti berikut. Perhatikan bahwa Anda harus 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 disarankan):

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 token akses berakhir masa berlakunya

Token akses yang dikeluarkan oleh Server Otorisasi OAuth 2.0 Google akan berakhir setelah durasi yang diberikan oleh nilai expires_in. Saat token akses habis masa berlakunya, 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 diberi otorisasi di halaman Delegasi tingkat domain di konsol Admin untuk pengguna dalam klaim (kolom) sub.

Meskipun biasanya memerlukan waktu beberapa menit, otorisasi dapat 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 diberi otorisasi menggunakan alamat email klien, bukan ID klien (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 diizinkan di konsol Admin.

Pastikan akun layanan diberi otorisasi di halaman Delegasi seluruh domain di konsol Admin untuk pengguna dalam klaim (kolom) sub, dan pastikan akun tersebut menyertakan semua cakupan yang Anda minta dalam klaim scope JWT Anda.

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

admin_policy_enforced (nilai apa pun) Akun Google tidak dapat mengizinkan 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 terbatas hingga akses diberikan secara eksplisit ke ID klien 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 akun layanan dan klien OAuth telah dikonfigurasi dengan benar dan Anda menggunakan alamat email yang benar.

Pastikan token JWT sudah benar dan dikeluarkan untuk ID klien dalam permintaan.

deleted_client (nilai apa pun)

Klien OAuth yang digunakan untuk membuat permintaan telah dihapus. Penghapusan dapat terjadi secara manual atau otomatis dalam kasus klien yang tidak digunakan . Klien yang dihapus dapat dipulihkan dalam waktu 30 hari setelah penghapusan. Pelajari lebih lanjut.

Gunakan ID klien yang masih aktif.

invalid_grant Not a valid email. Pengguna tidak ada. Periksa apakah 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 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 telah habis masa berlakunya.

Atau, pernyataan JWT mungkin dienkode secara salah - pernyataan tersebut harus dienkode Base64, tanpa baris baru atau tanda sama dengan padding.

Dekode set klaim JWT dan verifikasi bahwa 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) scope JWT diisi, dan bandingkan cakupan yang ada di dalamnya dengan cakupan yang didokumentasikan untuk API yang ingin Anda gunakan, untuk 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 "ID Kunci" yang digunakan untuk menandatangani pernyataan.

org_internal This client is restricted to users within its organization. ID klien 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.

Addendum: Otorisasi akun layanan tanpa OAuth

Dengan beberapa Google API, Anda dapat melakukan panggilan API yang sah 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 sah 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 apa pun, 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 file JSON akun layanan Anda.
    • Untuk kolom iss dan sub, tentukan alamat email akun layanan Anda. Anda dapat menemukan nilai ini di kolom client_email file JSON akun layanan Anda.
    • 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 tepat 3.600 detik kemudian, saat JWT akan berakhir.

Tandatangani JWT dengan RSA-256 menggunakan kunci pribadi yang ada di file JSON akun layanan Anda.

Contoh:

Java

Menggunakan google-auth-library-java dan java-jwt:

import com.google.auth.oauth2.ServiceAccountCredentials;
...
GoogleCredentials credentials =
        GoogleCredentials.fromStream(new FileInputStream("MyProject-1234.json"));
PrivateKey privateKey = ((ServiceAccountCredentials) credentials).getPrivateKey();
String privateKeyId = ((ServiceAccountCredentials) credentials).getPrivateKeyId();

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, 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 Anda adalah menerapkan Perlindungan Lintas Akun dengan menggunakan Layanan Perlindungan Lintas Akun Google. Layanan ini memungkinkan Anda berlangganan notifikasi peristiwa keamanan yang memberikan informasi kepada aplikasi Anda tentang perubahan besar pada akun pengguna. Kemudian, Anda 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 daftar lengkap peristiwa yang tersedia.