Menggunakan OAuth 2.0 untuk Aplikasi Server ke Server

Sistem Google OAuth 2.0 mendukung interaksi server-ke-server seperti antara aplikasi web dan layanan Google. Untuk skenario ini Anda memerlukan account layanan, yang merupakan akun yang dimiliki aplikasi Anda, bukan untuk pengguna akhir individu. Aplikasi Anda memanggil Google API atas nama akun layanan, sehingga pengguna tidak terlibat secara langsung. Skenario ini terkadang disebut "OAuth bercabang dua", atau "2LO". (Istilah terkait "OAuth bercabang tiga" mengacu pada skenario di mana aplikasi Anda memanggil Google API atas nama pengguna akhir, dan di mana persetujuan 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.

Google Workspace administrator domain juga dapat memberikan layanan account otoritas domain-lebar data akses pengguna atas nama pengguna di domain.

Dokumen ini menjelaskan bagaimana aplikasi dapat menyelesaikan alur OAuth 2.0 antar-server dengan menggunakan pustaka klien Google API (disarankan) atau HTTP.

Gambaran

Untuk dukungan interaksi server-ke-server, pertama kali membuat account layanan untuk proyek Anda dalam 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 resmi dengan menggunakan kredensial akun layanan untuk meminta token akses dari server auth 2.0 OAuth.

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

Membuat akun layanan

Kredensial akun layanan menyertakan alamat email yang dibuat yang unik dan setidaknya satu pasangan kunci publik/pribadi. Jika delegasi seluruh domain diaktifkan, maka ID klien juga merupakan bagian dari kredensial akun layanan.

Jika aplikasi Anda berjalan di Google App Engine, akun layanan disiapkan secara otomatis saat Anda membuat proyek.

Jika aplikasi Anda berjalan di Google Compute Engine, akun layanan juga disiapkan secara otomatis saat Anda membuat proyek, tetapi Anda harus menentukan cakupan yang perlu diakses aplikasi Anda saat membuat instance Google Compute Engine. Untuk informasi lebih lanjut, lihat Mempersiapkan sebuah contoh ke rekening penggunaan layanan .

Jika aplikasi Anda tidak berjalan di Google App Engine atau Google Compute Engine, Anda harus mendapatkan mandat 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:

  1. Open the Service accounts page.
  2. If prompted, select a project, or create a new one.
  3. Click  Create service account.
  4. Under Service account details, type a name, ID, and description for the service account, then click Create and continue.
  5. Optional: Under Grant this service account access to project, select the IAM roles to grant to the service account.
  6. Click Continue.
  7. Optional: Under Grant users access to this service account, add the users or groups that are allowed to use and manage the service account.
  8. Click Done.
  9. Click  Create key, then click Create.

Next, create a service account key:

  1. Click the email address for the service account you created.
  2. Click the Keys tab.
  3. In the Add key drop-down list, select Create new key.
  4. 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 setiap saat untuk melihat alamat email, sidik jari kunci publik, dan informasi lainnya, atau untuk menghasilkan publik / pasangan kunci pribadi tambahan. Untuk rincian lebih lanjut tentang kredensial account layanan di API Console, lihat layanan rekening di API Consolefile bantuan.

Catat alamat email akun layanan dan simpan file kunci pribadi akun layanan di lokasi yang dapat diakses oleh aplikasi Anda. Aplikasi Anda membutuhkan mereka untuk melakukan panggilan API resmi.

Mendelegasikan otoritas seluruh domain ke akun layanan

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

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

  1. Dari Google Workspace domain Anda konsol Admin , masuk ke menu utama > Keamanan> Kontrol API.
  2. Di panel delegasi lebar Domain, pilih Manage Domain lebar Delegasi.
  3. Klik Tambah baru.
  4. Dalam ID Klien, masukkan ID Klien account layanan ini. Anda dapat menemukan ID klien account layanan Anda dalam Service accounts page.
  5. Dalam lingkup OAuth lapangan (comma-delimited), masukkan daftar lingkup bahwa aplikasi Anda harus diberikan akses ke. Misalnya, jika aplikasi Anda membutuhkan akses domain-lebar penuh ke API Google Drive dan Calendar API Google, masukkan: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth kalender /.
  6. Klik Otorisasi.

Aplikasi Anda sekarang memiliki wewenang untuk melakukan panggilan API sebagai pengguna di domain Anda (untuk "meniru" pengguna). Saat Anda bersiap untuk melakukan panggilan API resmi, Anda menentukan pengguna yang akan ditiru.

Bersiap untuk melakukan panggilan API resmi

Jawa

Setelah Anda mendapatkan alamat email client dan kunci pribadi dari API Console, menggunakan Google API Client Library untuk Java untuk membuat GoogleCredential objek dari kredensial account layanan ini dan scopes aplikasi Anda membutuhkan akses ke. Sebagai 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 aplikasi bawaan sebagai gantinya, yang dapat menyederhanakan proses.

Delegasikan otoritas seluruh domain

Jika Anda telah mendelegasikan akses domain-lebar untuk account layanan dan Anda ingin meniru account pengguna, menentukan alamat email dari account pengguna dengan createDelegated metode dari GoogleCredential objek. Sebagai contoh:

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

Gunakan GoogleCredential objek untuk memanggil Google API dalam aplikasi Anda.

Python

Setelah Anda mendapatkan alamat email client dan kunci pribadi dari API Console, menggunakan Google API Client Library untuk Python untuk menyelesaikan langkah-langkah berikut:

  1. Buat Credentials objek dari kredensial account layanan ini dan scopes aplikasi Anda membutuhkan akses ke. Sebagai 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 aplikasi bawaan sebagai gantinya, yang dapat menyederhanakan proses.

  2. Delegasikan otoritas di seluruh domain

    Jika Anda telah mendelegasikan akses domain-lebar untuk account layanan dan Anda ingin meniru account pengguna, menggunakan with_subject metode yang ada ServiceAccountCredentials objek. Sebagai contoh:

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

Gunakan objek Credentials untuk memanggil Google API di aplikasi Anda.

HTTP/REST

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

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

Bagian berikutnya menjelaskan cara menyelesaikan langkah-langkah ini.

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

Ketika token akses berakhir , aplikasi Anda menghasilkan lain JWT, tanda-tanda itu, dan meminta tanda akses lain.

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

Sisa bagian ini menjelaskan secara spesifik pembuatan 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 diserialisasikan ke UTF-8 byte, kemudian dikodekan menggunakan pengkodean Base64url. Pengkodean ini memberikan ketahanan terhadap perubahan penyandian karena operasi penyandian berulang. Header, klaim set, dan tanda tangan yang bersambung bersama-sama dengan periode ( . ) Karakter.

Sebuah JWT terdiri 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 tajuk JWT

Header terdiri dari dua bidang yang menunjukkan algoritma penandatanganan dan format pernyataan. Kedua bidang wajib, dan setiap bidang hanya memiliki satu nilai. Saat algoritma dan format tambahan diperkenalkan, header ini akan berubah.

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

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

Representasi Base64url dari ini adalah sebagai berikut:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
Membentuk set 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 bidang adalah wajib. Seperti header JWT, set klaim JWT adalah objek JSON dan digunakan dalam perhitungan tanda tangan.

Klaim yang diperlukan

Klaim yang diperlukan dalam set klaim JWT ditunjukkan di bawah ini. Mereka mungkin muncul dalam urutan apa pun dalam kumpulan klaim.

Nama Keterangan
iss Alamat email akun layanan.
scope Daftar izin yang dibatasi spasi yang diminta aplikasi.
aud Deskripsi dari target asersi yang dimaksud. Ketika membuat akses token permintaan nilai ini selalu https://oauth2.googleapis.com/token .
exp Waktu kedaluwarsa pernyataan, ditetapkan sebagai detik sejak 00:00:00 UTC, 1 Januari 1970. Nilai ini memiliki maksimum 1 jam setelah waktu yang dikeluarkan.
iat Waktu pernyataan dikeluarkan, ditentukan sebagai detik sejak 00:00:00 UTC, 1 Januari 1970.

Representasi JSON dari bidang yang diperlukan dalam set klaim JWT ditunjukkan 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 seluruh domain untuk bertindak atas nama pengguna tertentu dalam suatu organisasi. Izin untuk melakukan jenis peniruan identitas ini harus diberikan sebelum aplikasi dapat meniru identitas pengguna, dan biasanya ditangani oleh administrator super. Untuk informasi lebih lanjut, lihat Kontrol akses API dengan delegasi domain-lebar .

Untuk mendapatkan token akses yang hibah aplikasi didelegasikan akses ke sumber daya, termasuk alamat email dari pengguna di JWT klaim ditetapkan sebagai nilai dari sub bidang.

Nama Keterangan
sub Alamat email pengguna yang aplikasinya meminta akses yang didelegasikan.

Jika sebuah aplikasi tidak memiliki izin untuk meniru pengguna, respon terhadap akses token permintaan yang mencakup sub bidang akan menjadi kesalahan .

Contoh dari klaim set JWT yang meliputi sub bidang 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
}
Mengkodekan kumpulan klaim JWT

Seperti header JWT, kumpulan klaim JWT harus diserialisasikan ke UTF-8 dan dikodekan dengan aman Base64url. Di bawah ini 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 panduan mekanik menghasilkan tanda tangan untuk JWT tersebut. 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 algoritme penandatanganan yang didukung oleh Server Otorisasi Google OAuth 2.0 adalah RSA yang menggunakan algoritme hashing SHA-256. Hal ini dinyatakan sebagai RS256 di alg lapangan di header JWT.

Menandatangani UTF-8 representasi dari masukan menggunakan SHA256withRSA (juga dikenal sebagai RSASSA-PKCS1-V1_5-SIGN dengan fungsi hash SHA-256) dengan kunci pribadi yang diperoleh dari Google API Console. Outputnya akan menjadi array byte.

Tanda tangan kemudian harus dikodekan Base64url. Header, klaim set, dan tanda tangan yang bersambung bersama-sama dengan periode ( . ) Karakter. Hasilnya adalah JWT. Itu harus sebagai berikut (jeda baris ditambahkan untuk kejelasan):

{Base64url encoded header}.
{Base64url encoded claim set}.
{Base64url encoded signature}

Di bawah ini adalah contoh JWT sebelum pengkodean 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]

Di bawah ini adalah contoh JWT yang telah ditandatangani dan siap untuk ditransmisikan:

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. Akses ini tanda permintaan adalah HTTPS POST permintaan, dan tubuh adalah URL dikodekan. URL ditampilkan di bawah ini:

https://oauth2.googleapis.com/token

Parameter berikut diperlukan dalam HTTPS POST permintaan:

Nama Keterangan
grant_type Gunakan string berikut, URL-dikodekan yang diperlukan: urn:ietf:params:oauth:grant-type:jwt-bearer
assertion JWT, termasuk tanda tangan.

Di bawah ini adalah dump mentah dari HTTPS POST permintaan digunakan dalam token akses permintaan:

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

Di bawah ini 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 dibentuk dengan benar dan akun layanan memiliki izin untuk melakukan operasi, maka respons JSON dari Server Otorisasi menyertakan token akses. Berikut ini adalah contoh tanggapan:

{
  "access_token": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M",
  "scope": "https://www.googleapis.com/auth/prediction"
  "token_type": "Bearer",
  "expires_in": 3600
}

Token akses dapat digunakan kembali selama jendela durasi ditentukan oleh expires_in nilai.

Memanggil Google API

Jawa

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

  1. Membuat objek layanan untuk API yang ingin Anda panggil menggunakan GoogleCredential objek. Sebagai contoh:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. Membuat permintaan untuk layanan API menggunakan antarmuka yang disediakan oleh objek layanan . Misalnya, untuk membuat daftar contoh Cloud SQL database dalam menarik-contoh-123 proyek:
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();

Python

Gunakan berwenang Credentials keberatan untuk memanggil Google API dengan menyelesaikan langkah-langkah berikut:

  1. Bangun objek layanan untuk API yang ingin Anda panggil. Anda membangun aa objek layanan dengan memanggil build fungsi dengan nama dan versi API dan berwenang Credentials objek. Misalnya, untuk memanggil versi 1beta3 Administrasi API Cloud SQL:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. Membuat permintaan untuk layanan API menggunakan antarmuka yang disediakan oleh objek layanan . Misalnya, untuk membuat daftar contoh Cloud SQL database dalam menarik-contoh-123 proyek:
    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 melakukan hal ini, termasuk akses token permintaan untuk API dengan termasuk salah seorang access_token parameter permintaan atau Authorization header HTTP Bearer nilai. Jika memungkinkan, header HTTP lebih disukai, karena string kueri cenderung terlihat di log server. Dalam kebanyakan kasus, Anda dapat menggunakan perpustakaan klien untuk mengatur panggilan Anda ke Google API (misalnya, ketika memanggil API drive Files ).

Anda dapat mencoba semua Google API dan melihat lingkup mereka di OAuth 2.0 Playground .

Contoh HTTP GET

Panggilan untuk drive.files endpoint (API drive Files) dengan menggunakan Authorization: Bearer HTTP header yang mungkin terlihat seperti berikut ini. 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 dikonfirmasi menggunakan access_token parameter string kueri:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

curl contoh

Anda dapat menguji perintah ini dengan curl aplikasi baris perintah. Berikut adalah contoh yang menggunakan opsi header HTTP (lebih disukai):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

Atau, sebagai alternatif, opsi parameter string kueri:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

Saat token akses kedaluwarsa

Akses token yang dikeluarkan oleh Otorisasi Server Google OAuth 2.0 berakhir setelah durasi yang disediakan oleh expires_in nilai. Ketika token akses kedaluwarsa, maka aplikasi harus membuat JWT lain, menandatanganinya, dan meminta token akses lain.

Kode kesalahan JWT

error lapangan error_description bidang Arti Bagaimana cara mengatasinya?
unauthorized_client Unauthorized client or scope in request. Jika Anda mencoba menggunakan delegasi seluruh domain, akun layanan tidak diotorisasi di konsol Admin domain pengguna.

Pastikan bahwa account layanan berwenang dalam delegasi Domain-lebar halaman konsol Admin bagi pengguna di sub klaim (lapangan).

Meskipun biasanya memerlukan waktu beberapa menit, mungkin perlu waktu hingga 24 jam agar otorisasi dapat 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 ID klien (numerik) di konsol Admin. Dalam delegasi Domain-lebar halaman di konsol Admin, menghapus klien, dan re-menambahkannya dengan ID numerik.
access_denied (nilai apa saja) Jika Anda menggunakan Delegasi seluruh domain, satu atau beberapa cakupan yang diminta tidak diotorisasi di konsol Admin.

Pastikan bahwa account layanan berwenang dalam delegasi Domain-lebar halaman konsol Admin bagi pengguna di sub klaim (lapangan), dan bahwa hal itu mencakup semua scopes Anda minta dalam scope klaim JWT Anda.

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

invalid_grant Not a valid email. Pengguna tidak ada. Periksa bahwa alamat email di sub klaim (lapangan) 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, ini berarti waktu sistem lokal tidak tepat. Hal ini juga bisa terjadi jika exp nilai lebih dari 65 menit di masa depan dari iat nilai, atau exp nilai lebih rendah dari iat nilai.

Pastikan jam pada sistem tempat JWT dihasilkan sudah benar. Jika perlu, sinkronisasi 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 kedaluwarsa.

Atau, pernyataan JWT mungkin salah dikodekan - itu harus dikodekan Base64, tanpa baris baru atau padding tanda sama dengan.

Dekode kumpulan klaim JWT dan verifikasi kunci yang menandatangani pernyataan terkait dengan akun layanan.

Coba gunakan pustaka 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 bahwa scope klaim (lapangan) dari JWT dihuni, dan membandingkan cakupan yang berisi dengan lingkup didokumentasikan untuk API yang ingin Anda gunakan, untuk memastikan tidak ada kesalahan atau kesalahan ketik.

Perhatikan bahwa daftar lingkup dalam scope kebutuhan mengklaim dipisahkan oleh spasi, tidak koma.

disabled_client The OAuth client was disabled. Kunci yang digunakan untuk menandatangani pernyataan JWT dinonaktifkan.

Pergi ke Google API Console, dan di bawah IAM & Admin> Pelayanan Akun, aktifkan account layanan yang berisi "Key ID" digunakan untuk menandatangani pernyataan.

Tambahan: Otorisasi akun layanan tanpa OAuth

Dengan beberapa Google API, Anda dapat membuat panggilan API resmi menggunakan JWT yang ditandatangani secara langsung sebagai token pembawa, bukan token akses OAuth 2.0. Jika memungkinkan, Anda dapat menghindari keharusan membuat permintaan jaringan ke server otorisasi Google sebelum melakukan panggilan API.

Jika API Anda ingin panggilan memiliki definisi layanan diterbitkan dalam repositori Google API GitHub , Anda dapat membuat panggilan API resmi menggunakan JWT bukan token akses. Untuk melakukannya:

  1. Buat account layanan seperti dijelaskan di atas. Pastikan untuk menyimpan file JSON yang Anda dapatkan saat membuat akun.
  2. Menggunakan perpustakaan JWT standar, seperti yang ditemukan di jwt.io , membuat 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 kid lapangan di header, menentukan account layanan Anda ID kunci pribadi. Anda dapat menemukan nilai ini di private_key_id bidang layanan file akun JSON Anda.
    • Untuk iss dan sub bidang, tentukan alamat email akun layanan Anda. Anda dapat menemukan nilai ini di client_email bidang layanan file akun JSON Anda.
    • Untuk aud lapangan, menentukan titik akhir API. Sebagai contoh: https:// SERVICE .googleapis.com/ .
    • Untuk iat lapangan, menentukan waktu Unix saat ini, dan untuk exp lapangan, menentukan waktu persis 3600 detik kemudian, ketika JWT akan berakhir.

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

Sebagai contoh:

Jawa

Menggunakan google-api-java-klien 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. Memanggil API, menggunakan ditandatangani JWT sebagai pembawa token:
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com