Ringkasan
Guna mendapatkan token akses per pengguna untuk memanggil Google API, Google menawarkan beberapa Library JavaScript:
Panduan ini memberikan petunjuk untuk bermigrasi dari library ini ke direktori Google Library Identity Services.
Dengan mengikuti panduan ini, Anda akan:
- mengganti {i>Platform Library<i} yang tidak digunakan lagi dengan pustaka Identity Services, dan
- jika menggunakan Library Klien API, hapus modul
gapi.auth2
yang tidak digunakan lagi, metode dan objeknya, menggantikannya dengan yang setara dengan Identity Services.
Untuk deskripsi mengenai hal-hal yang berubah dengan JavaScript Identity Services library membaca ringkasan dan cara kerja otorisasi pengguna untuk ditinjau istilah dan konsep penting.
Jika Anda mencari autentikasi untuk pendaftaran dan login pengguna, lihat Sebagai gantinya, migrasi dari Login dengan Google.
Identifikasi alur otorisasi Anda
Ada dua kemungkinan alur otorisasi pengguna: implisit dan otorisasi pada kode sumber.
Tinjau aplikasi web Anda untuk mengidentifikasi jenis alur otorisasi saat ini digunakan.
Indikasi bahwa aplikasi web Anda menggunakan alur implisit:
- Aplikasi web Anda sepenuhnya berbasis browser, tanpa platform backend.
- Pengguna harus ada untuk memanggil Google API, aplikasi Anda hanya menggunakan akses token, dan tidak memerlukan token refresh.
- Aplikasi web Anda memuat
apis.google.com/js/api.js
. - Penerapan Anda didasarkan pada OAuth 2.0 untuk Web Sisi Klien Aplikasi.
- Aplikasi Anda menggunakan modul
gapi.client
ataugapi.auth2
yang ada di Library Klien Google API untuk JavaScript.
Indikasi bahwa aplikasi web Anda menggunakan alur kode otorisasi:
Penerapan Anda didasarkan pada:
Aplikasi Anda berjalan di browser pengguna dan di platform backend Anda.
Platform backend Anda menghosting endpoint kode otorisasi.
Platform backend Anda memanggil Google API atas nama pengguna tanpa mewajibkan mereka ada, atau dikenal sebagai mode {i>offline<i}.
Token refresh dikelola dan disimpan oleh platform backend Anda.
Dalam beberapa kasus, codebase Anda mungkin mendukung kedua alur tersebut.
Pilih alur otorisasi
Sebelum memulai migrasi, Anda perlu menentukan apakah perlu melanjutkan alur yang ada atau mengadopsi alur lain yang paling sesuai dengan kebutuhan Anda.
Tinjau cara memilih alur otorisasi untuk memahami perbedaan utama dan konsekuensi di antara kedua alur tersebut.
Dalam sebagian besar kasus, alur kode otorisasi direkomendasikan karena menawarkan tingkat keamanan pengguna yang paling tinggi. Menerapkan alur ini juga memungkinkan Anda platform untuk menambahkan fungsi offline baru dengan lebih mudah seperti mengambil pembaruan untuk memberi tahu pengguna tentang perubahan penting pada kalender, foto, langganan, dan dan seterusnya.
Pilih alur otorisasi menggunakan pemilih di bawah ini.
Alur implisit
Dapatkan token akses untuk penggunaan dalam browser saat pengguna ada.
Contoh alur implisit menunjukkan aplikasi web sebelum dan sesudah migrasi ke Layanan Identitas.
Alur kode otorisasi
Kode otorisasi per pengguna yang diterbitkan oleh Google dikirim ke backend Anda platform, di mana ia kemudian ditukarkan dengan token akses dan token pembaruan.
Contoh alur kode otorisasi menunjukkan aplikasi web sebelum dan sesudah migrasi ke Identity Services.
Dalam panduan ini, ikuti petunjuk yang tercantum dalam huruf tebal untuk Menambahkan, Menghapus, Memperbarui, atau Mengganti fungsi yang ada.
Perubahan pada aplikasi web dalam browser Anda
Bagian ini meninjau perubahan yang akan Anda lakukan pada aplikasi web dalam browser saat yang akan bermigrasi ke library JavaScript Google Identity Services.
Mengidentifikasi kode dan pengujian yang terpengaruh
Cookie debug dapat membantu menemukan kode yang terpengaruh dan menguji pasca-penghentian perilaku model.
Di aplikasi yang besar atau kompleks, mungkin sulit untuk menemukan semua kode yang terpengaruh oleh
penghentian penggunaan modul gapi.auth2
. Untuk mencatat penggunaan yang ada,
fungsi yang tidak digunakan lagi ke konsol, tetapkan nilai
cookie G_AUTH2_MIGRATION
ke informational
. Atau, tambahkan titik dua, diikuti
berdasarkan nilai kunci agar juga masuk ke penyimpanan sesi. Setelah login
dan penerimaan kredensial meninjau atau mengirim log yang dikumpulkan ke backend untuk nanti
analisis data. Misalnya, informational:showauth2use
menyimpan origin dan URL ke
kunci penyimpanan sesi bernama showauth2use
.
Untuk memverifikasi perilaku aplikasi saat modul gapi.auth2
tidak lagi dimuat, setel
cookie G_AUTH2_MIGRATION
menjadi enforced
. Hal ini memungkinkan pengujian
perilaku pasca-penghentian sebelum tanggal penegakan kebijakan.
Nilai cookie G_AUTH2_MIGRATION
yang mungkin:
enforced
Jangan muat modulgapi.auth2
.informational
Catat penggunaan fungsi yang tidak digunakan lagi ke konsol JS. Juga catat ke penyimpanan sesi jika nama kunci opsional ditetapkan:informational:key-name
.
Untuk meminimalkan dampak terhadap pengguna, sebaiknya tetapkan cookie ini secara lokal terlebih dahulu selama pengembangan dan pengujian, sebelum menggunakannya di lingkungan produksi.
Library dan modul
Modul gapi.auth2
mengelola autentikasi pengguna untuk login dan autentikasi implisit
alur otorisasi, ganti modul yang tidak digunakan lagi ini, dan objeknya serta
dengan library Google Identity Services.
Tambahkan library Identity Services ke aplikasi web Anda dengan menyertakannya dalam dokumen:
<script src="https://accounts.google.com/gsi/client" async defer></script>
Hapus semua instance pemuatan modul auth2
menggunakan gapi.load('auth2',
function)
.
Library Google Identity Services menggantikan penggunaan modul gapi.auth2
.
Anda dapat terus menggunakan modul gapi.client
dengan aman dari Google API
Library Klien untuk JavaScript, dan memanfaatkan pembuatan otomatisnya
metode JS callable dari dokumen penemuan, yang mengelompokkan beberapa panggilan API,
dan fungsionalitas pengelolaan CORS.
Kukis
Otorisasi pengguna tidak memerlukan penggunaan cookie.
Lihat Bermigrasi dari Login dengan Google untuk mengetahui detail tentang cara autentikasi pengguna menggunakan cookie, dan Cara Google menggunakan cookie untuk cookie yang digunakan oleh produk dan layanan Google.
Kredensial
Google Identity Services memisahkan autentikasi dan otorisasi pengguna ke dalam dua operasi yang berbeda, dan kredensial pengguna adalah terpisah: token ID digunakan untuk mengidentifikasi pengguna dikembalikan secara terpisah dari token akses yang digunakan untuk otorisasi.
Untuk melihat perubahan ini, lihat contoh kredensial.
Alur implisit
Pisahkan autentikasi dan otorisasi pengguna dengan menghapus profil pengguna ditangani dari alur otorisasi.
Hapus referensi klien JavaScript Login dengan Google ini:
Metode
GoogleUser.getBasicProfile()
GoogleUser.getId()
Alur kode otorisasi
Identity Services memisahkan kredensial dalam browser menjadi token ID dan akses sebelumnya yang benar. Perubahan ini tidak berlaku untuk kredensial yang diperoleh melalui panggilan ke endpoint Google OAuth 2.0 dari platform backend Anda atau melalui yang berjalan di server aman di platform Anda seperti Google Cloud Klien Node.js API.
Status sesi
Sebelumnya, Login dengan Google membantu Anda mengelola status login pengguna menggunakan:
- Handler callback untuk Memantau status sesi pengguna.
- Pemroses untuk peristiwa dan perubahan status login pengguna Akun Google.
Anda bertanggung jawab untuk mengelola status login dan sesi pengguna ke web Anda .
Hapus referensi klien JavaScript Login dengan Google ini:
Objek:
gapi.auth2.SignInOptions
Metode:
GoogleAuth.attachClickHandler()
GoogleAuth.isSignedIn()
GoogleAuth.isSignedIn.get()
GoogleAuth.isSignedIn.listen()
GoogleAuth.signIn()
GoogleAuth.signOut()
GoogleAuth.currentUser.get()
GoogleAuth.currentUser.listen()
GoogleUser.isSignedIn()
Konfigurasi klien
Update aplikasi web Anda untuk melakukan inisialisasi klien token untuk model alur kode otorisasi.
Hapus referensi klien JavaScript Login dengan Google ini:
Objek:
gapi.auth2.ClientConfig
gapi.auth2.OfflineAccessOptions
Metode:
gapi.auth2.getAuthInstance()
GoogleUser.grant()
Alur implisit
Tambahkan objek TokenClientConfig
dan panggilan initTokenClient()
ke
mengonfigurasi aplikasi web, mengikuti contoh dalam melakukan inisialisasi token
klien Anda.
Ganti referensi klien JavaScript Login Google dengan Google Layanan Identitas:
Objek:
gapi.auth2.AuthorizeConfig
denganTokenClientConfig
Metode:
gapi.auth2.init()
dengangoogle.accounts.oauth2.initTokenClient()
Parameter:
gapi.auth2.AuthorizeConfig.login_hint
denganTokenClientConfig.login_hint
.gapi.auth2.GoogleUser.getHostedDomain()
denganTokenClientConfig.hd
.
Alur kode otorisasi
Tambahkan objek CodeClientConfig
dan panggilan initCodeClient()
untuk mengonfigurasi
aplikasi web Anda, dengan mengikuti contoh dalam melakukan inisialisasi Code Client.
Saat beralih dari alur kode implisit ke otorisasi:
Hapus referensi klien JavaScript Login dengan Google
Objek:
gapi.auth2.AuthorizeConfig
Metode:
gapi.auth2.init()
Parameter:
gapi.auth2.AuthorizeConfig.login_hint
gapi.auth2.GoogleUser.getHostedDomain()
Permintaan token
{i>Gesture <i}pengguna, seperti klik tombol, menghasilkan permintaan yang menghasilkan token akses yang dikembalikan langsung ke browser pengguna dengan perintah alur pembayaran, atau ke platform backend Anda setelah menukar kode otorisasi per pengguna untuk token akses dan token pembaruan.
Alur implisit
Token akses dapat diperoleh dan digunakan di dalam browser saat pengguna login dan memiliki sesi aktif dengan Google. Untuk mode implisit, pengguna {i>gesture <i}diperlukan untuk meminta token akses, bahkan jika ada permintaan.
Ganti referensi klien JavaScript Login Google: dengan Google Layanan Identitas:
Metode:
gapi.auth2.authorize()
denganTokenClient.requestAccessToken()
GoogleUser.reloadAuthResponse()
denganTokenClient.requestAccessToken()
Tambahkan link atau tombol untuk memanggil requestAccessToken()
guna memulai
untuk meminta token akses, atau untuk memperoleh token baru ketika
masa berlaku token yang ada habis.
Update codebase Anda untuk:
- Picu alur token OAuth 2.0 dengan
requestAccessToken()
. - Mendukung otorisasi inkremental menggunakan
requestAccessToken
danOverridableTokenClientConfig
guna memisahkan satu permintaan untuk banyak cakupan menjadi beberapa permintaan yang lebih kecil. - Meminta token baru saat masa berlaku token yang ada habis, atau dicabut.
Penggunaan beberapa cakupan mungkin memerlukan perubahan struktural pada codebase Anda untuk meminta akses ke cakupan hanya saat diperlukan, bukan sekaligus, ini dikenal sebagai otorisasi tambahan. Setiap permintaan harus berisi cakupannya sesedikit mungkin, dan idealnya satu ruang lingkup. Lihat cara menangani pengguna izin untuk mendapatkan informasi lebih lanjut tentang cara mengupdate aplikasi untuk otorisasi.
Saat masa berlaku token akses berakhir, modul gapi.auth2
akan otomatis memperoleh
token akses baru yang valid untuk aplikasi web Anda. Untuk keamanan pengguna yang lebih baik,
proses refresh token otomatis tidak didukung oleh Google Identity
Library layanan. Aplikasi web Anda harus diupdate untuk mendeteksi akses yang sudah tidak berlaku
dan meminta token baru. Lihat bagian Penanganan Token di bawah untuk informasi selengkapnya.
Alur kode otorisasi
Tambahkan link atau tombol untuk memanggil requestCode()
guna meminta otorisasi
kode dari Google. Untuk mengetahui contohnya, lihat Memicu Alur Kode OAuth 2.0.
Lihat bagian penanganan Token di bawah ini untuk informasi selengkapnya tentang cara menanggapi token akses yang sudah tidak berlaku atau dicabut.
Penanganan token
Add penanganan error untuk mendeteksi panggilan Google API yang gagal saat masa berlakunya habis atau token akses yang dicabut digunakan, dan untuk meminta token akses baru yang valid.
Kode status HTTP pesan error 401 Unauthorized
dan invalid_token
adalah
yang ditampilkan oleh Google API saat token akses yang habis masa berlakunya atau dicabut digunakan. Untuk
contoh, lihat Respons token tidak valid.
Token yang sudah tidak berlaku
Token akses berumur pendek, dan sering kali hanya valid untuk beberapa menit.
Pencabutan token
Pemilik Akun Google dapat mencabut izin yang diberikan sebelumnya, kapan saja. Melakukan
sehingga menjadi tidak valid untuk token akses dan
token refresh yang ada. Pencabutan mungkin
dipicu dari platform Anda menggunakan revoke()
atau melalui Google
Akun.
Ganti referensi klien JavaScript Login Google: dengan Google Layanan Identitas:
Metode:
getAuthInstance().disconnect()
dengangoogle.accounts.oauth2.revoke()
GoogleUser.disconnect()
dengangoogle.accounts.oauth2.revoke()
Panggil revoke
saat pengguna menghapus akunnya di platform Anda, atau
ingin menghapus izin untuk berbagi data dengan aplikasi Anda.
Dialog izin pengguna
Google menampilkan dialog izin kepada pengguna saat aplikasi web atau backend Anda platform meminta token akses. Lihat contoh dialog izin yang ditampilkan oleh Google kepada pengguna.
Sebelum menerbitkan token akses ke aplikasi Anda, token Google yang sudah ada dan aktif sesi diperlukan untuk meminta izin pengguna dan mencatat hasilnya. Pengguna mungkin diharuskan masuk ke Akun Google jika sesi yang ada belum telah ditetapkan.
Login pengguna
Pengguna mungkin masuk ke Akun Google di tab browser terpisah, atau secara bawaan melalui {i>browser<i} atau sistem operasi. Sebaiknya tambahkan Login Dengan Google ke situs Anda untuk membuat sesi aktif antara Akun Google dan browser saat pengguna pertama kali membuka aplikasi Anda. Dengan melakukannya, Anda akan mendapatkan manfaat:
- Meminimalkan frekuensi pengguna harus login, yang meminta akses ini memulai proses masuk Akun Google jika sesi aktif belum ada.
- Langsung gunakan kolom kredensial
email
JWT ID Token sebagai nilai parameterlogin_hint
diCodeClientConfig
atauTokenClientConfig
objek terstruktur dalam jumlah besar. Hal ini sangat membantu jika platform Anda tidak mempertahankan sistem manajemen akun pengguna Google. - Mencari dan mengaitkan Akun Google dengan akun pengguna lokal yang ada di platform Anda, membantu meminimalkan akun duplikat di platform Anda.
- Saat akun lokal baru dibuat, dialog dan alur pendaftaran dapat dengan jelas dipisahkan dari dialog dan alur otentikasi pengguna, sehingga mengurangi jumlah langkah yang diperlukan dan meningkatkan rasio {i>drop-off<i}.
Setelah login, dan sebelum token akses diterbitkan, pengguna harus memberikan izin bagi aplikasi Anda untuk cakupan yang diminta.
Respons izin dan token
Setelah disetujui, token akses akan ditampilkan bersama dengan daftar cakupan yang disetujui atau ditolak oleh pengguna.
Izin terperinci memungkinkan pengguna menyetujui atau menolak setiap cakupan. Kapan meminta akses ke beberapa cakupan, setiap cakupan akan diberikan atau ditolak terpisah dari cakupan lainnya. Berdasarkan pilihan pengguna aplikasi Anda secara selektif mengaktifkan fitur dan fungsionalitas yang bergantung pada cakupan individu.
Alur implisit
Ganti referensi klien JavaScript Login Google dengan Google Layanan Identitas:
Objek:
gapi.auth2.AuthorizeResponse
denganTokenClient.TokenResponse
gapi.auth2.AuthResponse
denganTokenClient.TokenResponse
Metode:
GoogleUser.hasGrantedScopes()
dengangoogle.accounts.oauth2.hasGrantedAllScopes()
GoogleUser.getGrantedScopes()
dengangoogle.accounts.oauth2.hasGrantedAllScopes()
Hapus referensi klien JavaScript Login dengan Google:
Metode:
GoogleUser.getAuthResponse()
Update aplikasi web Anda dengan hasGrantedAllScopes()
dan
hasGrantedAnyScope()
dengan mengikuti contoh izin terperinci ini.
Alur kode otorisasi
Memperbarui atau Menambahkan endpoint kode otorisasi ke backend Anda platform ini dengan mengikuti petunjuk dalam penanganan kode autentikasi.
Update platform Anda untuk mengikuti langkah-langkah yang dijelaskan di bagian Menggunakan Kode Panduan model untuk memvalidasi permintaan dan mendapatkan token akses, lalu memuat ulang sebelumnya yang benar.
Update platform Anda untuk mengaktifkan atau menonaktifkan fitur secara selektif dan fungsi berdasarkan setiap cakupan yang telah disetujui pengguna oleh dengan mengikuti petunjuk otorisasi inkremental dan periksa cakupan akses yang diberikan oleh pengguna.
Contoh alur implisit
Cara lama
Library Klien GAPI
Contoh Library Klien Google API untuk JavaScript yang berjalan di browser menggunakan dialog pop-up untuk izin pengguna.
Modul gapi.auth2
secara otomatis dimuat dan digunakan oleh
gapi.client.init()
, dan sebagainya tersembunyi.
<!DOCTYPE html>
<html>
<head>
<script src="https://apis.google.com/js/api.js"></script>
<script>
function start() {
gapi.client.init({
'apiKey': 'YOUR_API_KEY',
'clientId': 'YOUR_CLIENT_ID',
'scope': 'https://www.googleapis.com/auth/cloud-translation',
'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
}).then(function() {
// Execute an API request which is returned as a Promise.
// The method name language.translations.list comes from the API discovery.
return gapi.client.language.translations.list({
q: 'hello world',
source: 'en',
target: 'de',
});
}).then(function(response) {
console.log(response.result.data.translations[0].translatedText);
}, function(reason) {
console.log('Error: ' + reason.result.error.message);
});
};
// Load the JavaScript client library and invoke start afterwards.
gapi.load('client', start);
</script>
</head>
<body>
<div id="results"></div>
</body>
</html>
Library Klien JS
OAuth 2.0 untuk Aplikasi Web Sisi Klien yang berjalan di browser menggunakan dialog pop-up untuk izin pengguna.
Modul gapi.auth2
dimuat secara manual.
<!DOCTYPE html>
<html><head></head><body>
<script>
var GoogleAuth;
var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
function handleClientLoad() {
// Load the API's client and auth2 modules.
// Call the initClient function after the modules load.
gapi.load('client:auth2', initClient);
}
function initClient() {
// In practice, your app can retrieve one or more discovery documents.
var discoveryUrl = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';
// Initialize the gapi.client object, which app uses to make API requests.
// Get API key and client ID from API Console.
// 'scope' field specifies space-delimited list of access scopes.
gapi.client.init({
'apiKey': 'YOUR_API_KEY',
'clientId': 'YOUR_CLIENT_ID',
'discoveryDocs': [discoveryUrl],
'scope': SCOPE
}).then(function () {
GoogleAuth = gapi.auth2.getAuthInstance();
// Listen for sign-in state changes.
GoogleAuth.isSignedIn.listen(updateSigninStatus);
// Handle initial sign-in state. (Determine if user is already signed in.)
var user = GoogleAuth.currentUser.get();
setSigninStatus();
// Call handleAuthClick function when user clicks on
// "Sign In/Authorize" button.
$('#sign-in-or-out-button').click(function() {
handleAuthClick();
});
$('#revoke-access-button').click(function() {
revokeAccess();
});
});
}
function handleAuthClick() {
if (GoogleAuth.isSignedIn.get()) {
// User is authorized and has clicked "Sign out" button.
GoogleAuth.signOut();
} else {
// User is not signed in. Start Google auth flow.
GoogleAuth.signIn();
}
}
function revokeAccess() {
GoogleAuth.disconnect();
}
function setSigninStatus() {
var user = GoogleAuth.currentUser.get();
var isAuthorized = user.hasGrantedScopes(SCOPE);
if (isAuthorized) {
$('#sign-in-or-out-button').html('Sign out');
$('#revoke-access-button').css('display', 'inline-block');
$('#auth-status').html('You are currently signed in and have granted ' +
'access to this app.');
} else {
$('#sign-in-or-out-button').html('Sign In/Authorize');
$('#revoke-access-button').css('display', 'none');
$('#auth-status').html('You have not authorized this app or you are ' +
'signed out.');
}
}
function updateSigninStatus() {
setSigninStatus();
}
</script>
<button id="sign-in-or-out-button"
style="margin-left: 25px">Sign In/Authorize</button>
<button id="revoke-access-button"
style="display: none; margin-left: 25px">Revoke access</button>
<div id="auth-status" style="display: inline; padding-left: 25px"></div><hr>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script async defer src="https://apis.google.com/js/api.js"
onload="this.onload=function(){};handleClientLoad()"
onreadystatechange="if (this.readyState === 'complete') this.onload()">
</script>
</body></html>
Endpoint OAuth 2.0
OAuth 2.0 untuk Aplikasi Web Sisi Klien yang berjalan di browser menggunakan mengalihkan pengguna ke Google untuk mendapatkan izin pengguna.
Contoh ini menunjukkan panggilan langsung ke endpoint OAuth 2.0 Google dari
browser pengguna dan tidak menggunakan modul gapi.auth2
atau JavaScript
library.
<!DOCTYPE html>
<html><head></head><body>
<script>
var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';
var fragmentString = location.hash.substring(1);
// Parse query string to see if page request is coming from OAuth 2.0 server.
var params = {};
var regex = /([^&=]+)=([^&]*)/g, m;
while (m = regex.exec(fragmentString)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
}
if (Object.keys(params).length > 0) {
localStorage.setItem('oauth2-test-params', JSON.stringify(params) );
if (params['state'] && params['state'] == 'try_sample_request') {
trySampleRequest();
}
}
// If there's an access token, try an API request.
// Otherwise, start OAuth 2.0 flow.
function trySampleRequest() {
var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
if (params && params['access_token']) {
var xhr = new XMLHttpRequest();
xhr.open('GET',
'https://www.googleapis.com/drive/v3/about?fields=user&' +
'access_token=' + params['access_token']);
xhr.onreadystatechange = function (e) {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.response);
} else if (xhr.readyState === 4 && xhr.status === 401) {
// Token invalid, so prompt for user permission.
oauth2SignIn();
}
};
xhr.send(null);
} else {
oauth2SignIn();
}
}
/*
* Create form to request access token from Google's OAuth 2.0 server.
*/
function oauth2SignIn() {
// Google's OAuth 2.0 endpoint for requesting an access token
var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
// Create element to open OAuth 2.0 endpoint in new window.
var form = document.createElement('form');
form.setAttribute('method', 'GET'); // Send as a GET request.
form.setAttribute('action', oauth2Endpoint);
// Parameters to pass to OAuth 2.0 endpoint.
var params = {'client_id': YOUR_CLIENT_ID,
'redirect_uri': YOUR_REDIRECT_URI,
'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
'state': 'try_sample_request',
'include_granted_scopes': 'true',
'response_type': 'token'};
// Add form parameters as hidden input values.
for (var p in params) {
var input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', p);
input.setAttribute('value', params[p]);
form.appendChild(input);
}
// Add form to page and submit it to open the OAuth 2.0 endpoint.
document.body.appendChild(form);
form.submit();
}
</script>
<button onclick="trySampleRequest();">Try sample request</button>
</body></html>
Cara baru
Khusus GIS
Contoh ini hanya menampilkan library JavaScript Google Identity Service menggunakan model token dan dialog pop-up untuk izin pengguna. Penting untuk mengilustrasikan jumlah langkah minimal yang diperlukan untuk mengkonfigurasi klien, meminta dan memperoleh token akses, serta memanggil API Google.
<!DOCTYPE html>
<html>
<head>
<script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
</head>
<body>
<script>
var client;
var access_token;
function initClient() {
client = google.accounts.oauth2.initTokenClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly \
https://www.googleapis.com/auth/contacts.readonly',
callback: (tokenResponse) => {
access_token = tokenResponse.access_token;
},
});
}
function getToken() {
client.requestAccessToken();
}
function revokeToken() {
google.accounts.oauth2.revoke(access_token, () => {console.log('access token revoked')});
}
function loadCalendar() {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.googleapis.com/calendar/v3/calendars/primary/events');
xhr.setRequestHeader('Authorization', 'Bearer ' + access_token);
xhr.send();
}
</script>
<h1>Google Identity Services Authorization Token model</h1>
<button onclick="getToken();">Get access token</button><br><br>
<button onclick="loadCalendar();">Load Calendar</button><br><br>
<button onclick="revokeToken();">Revoke token</button>
</body>
</html>
async/await GAPI
Contoh ini menunjukkan cara menambahkan library Google Identity Service menggunakan
model token, hapus modul gapi.auth2
, dan panggil API menggunakan
Library Klien Google API untuk JavaScript.
Promise, asinkron, dan await digunakan untuk menerapkan urutan pemuatan library dan menangkap dan mencoba kembali {i>error<i} otorisasi. Panggilan API hanya dilakukan setelah panggilan token akses tersedia.
Pengguna diharapkan menekan 'Tampilkan Kalender' saat token akses tidak ada saat halaman pertama kali dimuat, atau setelahnya setelah token akses masa berlakunya telah berakhir.
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>GAPI with GIS async/await</h1>
<button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
<button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>
<script>
const gapiLoadPromise = new Promise((resolve, reject) => {
gapiLoadOkay = resolve;
gapiLoadFail = reject;
});
const gisLoadPromise = new Promise((resolve, reject) => {
gisLoadOkay = resolve;
gisLoadFail = reject;
});
var tokenClient;
(async () => {
document.getElementById("showEventsBtn").style.visibility="hidden";
document.getElementById("revokeBtn").style.visibility="hidden";
// First, load and initialize the gapi.client
await gapiLoadPromise;
await new Promise((resolve, reject) => {
// NOTE: the 'auth2' module is no longer loaded.
gapi.load('client', {callback: resolve, onerror: reject});
});
await gapi.client.init({
// NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
})
.then(function() { // Load the Calendar API discovery document.
gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
});
// Now load the GIS client
await gisLoadPromise;
await new Promise((resolve, reject) => {
try {
tokenClient = google.accounts.oauth2.initTokenClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
prompt: 'consent',
callback: '', // defined at request time in await/promise scope.
});
resolve();
} catch (err) {
reject(err);
}
});
document.getElementById("showEventsBtn").style.visibility="visible";
document.getElementById("revokeBtn").style.visibility="visible";
})();
async function getToken(err) {
if (err.result.error.code == 401 || (err.result.error.code == 403) &&
(err.result.error.status == "PERMISSION_DENIED")) {
// The access token is missing, invalid, or expired, prompt for user consent to obtain one.
await new Promise((resolve, reject) => {
try {
// Settle this promise in the response callback for requestAccessToken()
tokenClient.callback = (resp) => {
if (resp.error !== undefined) {
reject(resp);
}
// GIS has automatically updated gapi.client with the newly issued access token.
console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));
resolve(resp);
};
tokenClient.requestAccessToken();
} catch (err) {
console.log(err)
}
});
} else {
// Errors unrelated to authorization: server errors, exceeding quota, bad requests, and so on.
throw new Error(err);
}
}
function showEvents() {
// Try to fetch a list of Calendar events. If a valid access token is needed,
// prompt to obtain one and then retry the original request.
gapi.client.calendar.events.list({ 'calendarId': 'primary' })
.then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
.catch(err => getToken(err)) // for authorization errors obtain an access token
.then(retry => gapi.client.calendar.events.list({ 'calendarId': 'primary' }))
.then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
.catch(err => console.log(err)); // cancelled by user, timeout, etc.
}
function revokeToken() {
let cred = gapi.client.getToken();
if (cred !== null) {
google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
gapi.client.setToken('');
}
}
</script>
<script async defer src="https://apis.google.com/js/api.js" onload="gapiLoadOkay()" onerror="gapiLoadFail(event)"></script>
<script async defer src="https://accounts.google.com/gsi/client" onload="gisLoadOkay()" onerror="gisLoadFail(event)"></script>
</body>
</html>
Callback GAPI
Contoh ini menunjukkan cara menambahkan library Google Identity Service menggunakan
model token, hapus modul gapi.auth2
, dan panggil API menggunakan
Library Klien Google API untuk JavaScript.
Variabel digunakan untuk menerapkan urutan pemuatan library. Panggilan GAPI dilakukan dari dalam callback setelah token akses yang valid ditampilkan.
Pengguna diharapkan menekan tombol Tampilkan Kalender saat halaman ditampilkan pertama kali dimuat dan dimuat lagi saat mereka ingin memuat ulang info Kalender mereka.
<!DOCTYPE html>
<html>
<head>
<script async defer src="https://apis.google.com/js/api.js" onload="gapiLoad()"></script>
<script async defer src="https://accounts.google.com/gsi/client" onload="gisInit()"></script>
</head>
<body>
<h1>GAPI with GIS callbacks</h1>
<button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
<button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>
<script>
let tokenClient;
let gapiInited;
let gisInited;
document.getElementById("showEventsBtn").style.visibility="hidden";
document.getElementById("revokeBtn").style.visibility="hidden";
function checkBeforeStart() {
if (gapiInited && gisInited){
// Start only when both gapi and gis are initialized.
document.getElementById("showEventsBtn").style.visibility="visible";
document.getElementById("revokeBtn").style.visibility="visible";
}
}
function gapiInit() {
gapi.client.init({
// NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
})
.then(function() { // Load the Calendar API discovery document.
gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
gapiInited = true;
checkBeforeStart();
});
}
function gapiLoad() {
gapi.load('client', gapiInit)
}
function gisInit() {
tokenClient = google.accounts.oauth2.initTokenClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
callback: '', // defined at request time
});
gisInited = true;
checkBeforeStart();
}
function showEvents() {
tokenClient.callback = (resp) => {
if (resp.error !== undefined) {
throw(resp);
}
// GIS has automatically updated gapi.client with the newly issued access token.
console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));
gapi.client.calendar.events.list({ 'calendarId': 'primary' })
.then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
.catch(err => console.log(err));
document.getElementById("showEventsBtn").innerText = "Refresh Calendar";
}
// Conditionally ask users to select the Google Account they'd like to use,
// and explicitly obtain their consent to fetch their Calendar.
// NOTE: To request an access token a user gesture is necessary.
if (gapi.client.getToken() === null) {
// Prompt the user to select a Google Account and asked for consent to share their data
// when establishing a new session.
tokenClient.requestAccessToken({prompt: 'consent'});
} else {
// Skip display of account chooser and consent dialog for an existing session.
tokenClient.requestAccessToken({prompt: ''});
}
}
function revokeToken() {
let cred = gapi.client.getToken();
if (cred !== null) {
google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
gapi.client.setToken('');
document.getElementById("showEventsBtn").innerText = "Show Calendar";
}
}
</script>
</body>
</html>
Contoh alur kode otorisasi
UX {i>pop-up library Google Identity Service<i} dapat menggunakan pengalihan URL ke tampilkan kode otorisasi langsung ke endpoint token backend Anda, atau Pengendali callback JavaScript yang berjalan di browser pengguna yang menjadi proxy respons terhadap platform Anda. Dalam kedua kasus tersebut, platform backend Anda akan alur OAuth 2.0 untuk memperoleh token refresh dan akses yang valid.
Cara lama
Aplikasi Web Sisi Server
Login dengan Google untuk aplikasi sisi server yang berjalan di platform backend menggunakan pengalihan ke Google untuk izin pengguna.
<!DOCTYPE html>
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
<script>
function start() {
gapi.load('auth2', function() {
auth2 = gapi.auth2.init({
client_id: 'YOUR_CLIENT_ID',
api_key: 'YOUR_API_KEY',
discovery_docs: ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
// Scopes to request in addition to 'profile' and 'email'
scope: 'https://www.googleapis.com/auth/cloud-translation',
});
});
}
function signInCallback(authResult) {
if (authResult['code']) {
console.log("sending AJAX request");
// Send authorization code obtained from Google to backend platform
$.ajax({
type: 'POST',
url: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
// Always include an X-Requested-With header to protect against CSRF attacks.
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
contentType: 'application/octet-stream; charset=utf-8',
success: function(result) {
console.log(result);
},
processData: false,
data: authResult['code']
});
} else {
console.log('error: failed to obtain authorization code')
}
}
</script>
</head>
<body>
<button id="signinButton">Sign In With Google</button>
<script>
$('#signinButton').click(function() {
// Obtain an authorization code from Google
auth2.grantOfflineAccess().then(signInCallback);
});
</script>
</body>
</html>
HTTP/REST menggunakan pengalihan
Menggunakan OAuth 2.0 untuk Aplikasi Server Web untuk mengirim kode otorisasi dari browser pengguna ke platform backend Anda. Izin pengguna ditangani oleh mengalihkan browser pengguna ke Google.
/\*
\* Create form to request access token from Google's OAuth 2.0 server.
\*/
function oauthSignIn() {
// Google's OAuth 2.0 endpoint for requesting an access token
var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
// Create <form> element to submit parameters to OAuth 2.0 endpoint.
var form = document.createElement('form');
form.setAttribute('method', 'GET'); // Send as a GET request.
form.setAttribute('action', oauth2Endpoint);
// Parameters to pass to OAuth 2.0 endpoint.
var params = {'client\_id': 'YOUR_CLIENT_ID',
'redirect\_uri': 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
'response\_type': 'token',
'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
'include\_granted\_scopes': 'true',
'state': 'pass-through value'};
// Add form parameters as hidden input values.
for (var p in params) {
var input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', p);
input.setAttribute('value', params[p]);
form.appendChild(input);
}
// Add form to page and submit it to open the OAuth 2.0 endpoint.
document.body.appendChild(form);
form.submit();
}
Cara baru
UX Pop-up GIS
Contoh ini hanya menampilkan library JavaScript Google Identity Service menggunakan model kode otorisasi berupa dialog pop-up untuk izin pengguna dan untuk menerima kode otorisasi dari Google. Penting untuk mengilustrasikan jumlah langkah minimal yang diperlukan untuk mengkonfigurasi klien, dapatkan izin dan kirim kode otorisasi ke backend Anda terkelola sepenuhnya.
<!DOCTYPE html>
<html>
<head>
<script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
</head>
<body>
<script>
var client;
function initClient() {
client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'popup',
callback: (response) => {
var code_receiver_uri = 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI',
// Send auth code to your backend platform
const xhr = new XMLHttpRequest();
xhr.open('POST', code_receiver_uri, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onload = function() {
console.log('Signed in as: ' + xhr.responseText);
};
xhr.send('code=' + response.code);
// After receipt, the code is exchanged for an access token and
// refresh token, and the platform then updates this web app
// running in user's browser with the requested calendar info.
},
});
}
function getAuthCode() {
// Request authorization code and obtain user consent
client.requestCode();
}
</script>
<button onclick="getAuthCode();">Load Your Calendar</button>
</body>
</html>
UX Pengalihan GIS
Model kode otorisasi mendukung pop-up dan mengalihkan mode UX ke kirim kode otorisasi per pengguna ke endpoint yang dihosting oleh platform Anda. Mode UX pengalihan ditampilkan di sini:
<!DOCTYPE html>
<html>
<head>
<script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
</head>
<body>
<script>
var client;
function initClient() {
client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly \
https://www.googleapis.com/auth/photoslibrary.readonly',
ux_mode: 'redirect',
redirect_uri: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI'
});
}
// Request an access token
function getAuthCode() {
// Request authorization code and obtain user consent
client.requestCode();
}
</script>
<button onclick="getAuthCode();">Load Your Calendar</button>
</body>
</html>
Library JavaScript
Google Identity Services adalah library JavaScript tunggal yang digunakan untuk pengguna autentikasi dan otorisasi yang menggabungkan dan menggantikan fitur dan fungsi yang ditemukan di beberapa library dan modul yang berbeda:
Tindakan yang harus dilakukan saat bermigrasi ke Identity Services:
Library JS yang ada | Library JS baru | Catatan |
---|---|---|
apis.google.com/js/api.js |
accounts.google.com/gsi/client |
Tambahkan library baru dan ikuti alur implisit. |
apis.google.com/js/client.js |
accounts.google.com/gsi/client |
Tambahkan library baru dan alur kode otorisasi. |
Referensi cepat library
Perbandingan objek dan metode antara JavaScript Login dengan Google Lama client dan library Baru Google Identity Services, serta Catatan dengan informasi tambahan dan tindakan yang perlu dilakukan selama migrasi.
Lama | Baru | Catatan |
---|---|---|
GoogleAuth dan metode terkait: | ||
GoogleAuth.attachClickHandler() | Hapus | |
GoogleAuth.currentUser.get() | Hapus | |
GoogleAuth.currentUser.listen() | Hapus | |
GoogleAuth.disconnect() | google.accounts.oauth2.revoke | Ganti yang lama dengan yang baru. Pencabutan juga dapat terjadi dari https://myaccount.google.com/permissions |
GoogleAuth.grantOfflineAccess() | Hapus, ikuti alur kode otorisasi. | |
GoogleAuth.isSignedIn.get() | Hapus | |
GoogleAuth.isSignedIn.listen() | Hapus | |
GoogleAuth.signIn() | Hapus | |
GoogleAuth.signOut() | Hapus | |
GoogleAuth.then() | Hapus | |
GoogleUser dan metode terkait: | ||
GoogleUser.disconnect() | google.accounts.id.revoke | Ganti yang lama dengan yang baru. Pencabutan juga dapat terjadi dari https://myaccount.google.com/permissions |
GoogleUser.getAuthResponse() | requestCode() or requestAccessToken() | Ganti yang lama dengan yang baru |
GoogleUser.getBasicProfile() | Hapus. Sebagai gantinya, gunakan Token ID, lihat Bermigrasi dari Login dengan Google. | |
GoogleUser.getGrantedScopes() | hasGrantedAnyScope() | Ganti yang lama dengan yang baru |
GoogleUser.getHostedDomain() | Hapus | |
GoogleUser.getId() | Hapus | |
GoogleUser.grantOfflineAccess() | Hapus, ikuti alur kode otorisasi. | |
GoogleUser.grant() | Hapus | |
GoogleUser.hasGrantedScopes() | hasGrantedAnyScope() | Ganti yang lama dengan yang baru |
GoogleUser.isSignedIn() | Hapus | |
GoogleUser.reloadAuthResponse() | requestAccessToken() | Hapus yang lama, panggil yang baru untuk mengganti token akses yang sudah tidak berlaku atau dicabut. |
gapi.auth2 dan metode terkait: | ||
Objek gapi.auth2.AuthorizeConfig | TokenClientConfig atau CodeClientConfig | Ganti yang lama dengan yang baru |
Objek gapi.auth2.AuthorizeResponse | Hapus | |
Objek gapi.auth2.AuthResponse | Hapus | |
gapi.auth2.authorize() | requestCode() or requestAccessToken() | Ganti yang lama dengan yang baru |
gapi.auth2.ClientConfig() | TokenClientConfig atau CodeClientConfig | Ganti yang lama dengan yang baru |
gapi.auth2.getAuthInstance() | Hapus | |
gapi.auth2.init() | initTokenClient() or initCodeClient() | Ganti yang lama dengan yang baru |
Objek gapi.auth2.OfflineAccessOptions | Hapus | |
Objek gapi.auth2.SignInOptions | Hapus | |
gapi.signin2 dan metode terkait: | ||
gapi.signin2.render() | Hapus. Pemuatan DOM HTML dari g_id_signin atau panggilan JS ke google.accounts.id.renderButton memicu login pengguna ke Akun Google. |
Contoh kredensial
Kredensial yang ada
Library platform Login dengan Google, Library Klien Google API untuk JavaScript, atau panggilan langsung ke endpoint Google Auth 2.0 akan menampilkan token akses OAuth 2.0 dan Token ID OpenID Connect dalam satu yang dihasilkan.
Contoh respons yang berisi access_token
dan id_token
:
{
"token_type": "Bearer",
"access_token": "ya29.A0ARrdaM-SmArZaCIh68qXsZSzyeU-8mxhQERHrP2EXtxpUuZ-3oW8IW7a6D2J6lRnZrRj8S6-ZcIl5XVEqnqxq5fuMeDDH_6MZgQ5dgP7moY-yTiKR5kdPm-LkuPM-mOtUsylWPd1wpRmvw_AGOZ1UUCa6UD5Hg",
"scope": "https://www.googleapis.com/auth/calendar.readonly",
"login_hint": "AJDLj6I2d1RH77cgpe__DdEree1zxHjZJr4Q7yOisoumTZUmo5W2ZmVFHyAomUYzLkrluG-hqt4RnNxrPhArd5y6p8kzO0t8xIfMAe6yhztt6v2E-_Bb4Ec3GLFKikHSXNh5bI-gPrsI",
"expires_in": 3599,
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzNDFhYmM0MDkyYjZmYzAzOGU0MDNjOTEwMjJkZDNlNDQ1MzliNTYiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTE3NzI2NDMxNjUxOTQzNjk4NjAwIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXRfaGFzaCI6IkJBSW55TjN2MS1ZejNLQnJUMVo0ckEiLCJuYW1lIjoiQnJpYW4gRGF1Z2hlcnR5IiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hLS9BT2gxNEdnenAyTXNGRGZvbVdMX3VDemRYUWNzeVM3ZGtxTE5ybk90S0QzVXNRPXM5Ni1jIiwiZ2l2ZW5fbmFtZSI6IkJyaWFuIiwiZmFtaWx5X25hbWUiOiJEYXVnaGVydHkiLCJsb2NhbGUiOiJlbiIsImlhdCI6MTYzODk5MTYzOCwiZXhwIjoxNjM4OTk1MjM4LCJqdGkiOiI5YmRkZjE1YWFiNzE2ZDhjYmJmNDYwMmM1YWM3YzViN2VhMDQ5OTA5In0.K3EA-3Adw5HA7O8nJVCsX1HmGWxWzYk3P7ViVBb4H4BoT2-HIgxKlx1mi6jSxIUJGEekjw9MC-nL1B9Asgv1vXTMgoGaNna0UoEHYitySI23E5jaMkExkTSLtxI-ih2tJrA2ggfA9Ekj-JFiMc6MuJnwcfBTlsYWRcZOYVw3QpdTZ_VYfhUu-yERAElZCjaAyEXLtVQegRe-ymScra3r9S92TA33ylMb3WDTlfmDpWL0CDdDzby2asXYpl6GQ7SdSj64s49Yw6mdGELZn5WoJqG7Zr2KwIGXJuSxEo-wGbzxNK-mKAiABcFpYP4KHPEUgYyz3n9Vqn2Tfrgp-g65BQ",
"session_state": {
"extraQueryParams": {
"authuser": "0"
}
},
"first_issued_at": 1638991637982,
"expires_at": 1638995236982,
"idpId": "google"
}
Kredensial Google Identity Services
Library Google Identity Services menampilkan:
token akses ketika digunakan untuk otorisasi:
{ "access_token": "ya29.A0ARrdaM_LWSO-uckLj7IJVNSfnUityT0Xj-UCCrGxFQdxmLiWuAosnAKMVQ2Z0LLqeZdeJii3TgULp6hR_PJxnInBOl8UoUwWoqsrGQ7-swxgy97E8_hnzfhrOWyQBmH6zs0_sUCzwzhEr_FAVqf92sZZHphr0g", "token_type": "Bearer", "expires_in": 3599, "scope": "https://www.googleapis.com/auth/calendar.readonly" }
atau, token ID saat digunakan untuk otentikasi:
{ "clientId": "538344653255-758c5h5isc45vgk27d8h8deabovpg6to.apps.googleusercontent.com", "credential": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxODkyZWI0OWQ3ZWY5YWRmOGIyZTE0YzA1Y2EwZDAzMjcxNGEyMzciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYmYiOjE2MzkxNTcyNjQsImF1ZCI6IjUzODM0NDY1MzI1NS03NThjNWg1aXNjNDV2Z2syN2Q4aDhkZWFib3ZwZzZ0by5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInN1YiI6IjExNzcyNjQzMTY1MTk0MzY5ODYwMCIsIm5vbmNlIjoiZm9vYmFyIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwibmFtZSI6IkJyaWFuIERhdWdoZXJ0eSIsInBpY3R1cmUiOiJodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vYS0vQU9oMTRHZ3pwMk1zRkRmb21XTF91Q3pkWFFjc3lTN2RrcUxOcm5PdEtEM1VzUT1zOTYtYyIsImdpdmVuX25hbWUiOiJCcmlhbiIsImZhbWlseV9uYW1lIjoiRGF1Z2hlcnR5IiwiaWF0IjoxNjM5MTU3NTY0LCJleHAiOjE2MzkxNjExNjQsImp0aSI6IjRiOTVkYjAyZjU4NDczMmUxZGJkOTY2NWJiMWYzY2VhYzgyMmI0NjUifQ.Cr-AgMsLFeLurnqyGpw0hSomjOCU4S3cU669Hyi4VsbqnAV11zc_z73o6ahe9Nqc26kPVCNRGSqYrDZPfRyTnV6g1PIgc4Zvl-JBuy6O9HhClAK1HhMwh1FpgeYwXqrng1tifmuotuLQnZAiQJM73Gl-J_6s86Buo_1AIx5YAKCucYDUYYdXBIHLxrbALsA5W6pZCqqkMbqpTWteix-G5Q5T8LNsfqIu_uMBUGceqZWFJALhS9ieaDqoxhIqpx_89QAr1YlGu_UO6R6FYl0wDT-nzjyeF5tonSs3FHN0iNIiR3AMOHZu7KUwZaUdHg4eYkU-sQ01QNY_11keHROCRQ", "select_by": "user" }
Respons token tidak valid
Contoh respons dari Google saat mencoba membuat permintaan API menggunakan token akses yang kedaluwarsa, dicabut, atau tidak valid:
Header Respons HTTP
www-authenticate: Bearer realm="https://accounts.google.com/", error="invalid_token"
Isi respons
{
"error": {
"code": 401,
"message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"errors": [
{
"message": "Invalid Credentials",
"domain": "global",
"reason": "authError",
"location": "Authorization",
"locationType": "header"
}
],
"status": "UNAUTHENTICATED"
}
}