Dokumen ini menjelaskan cara menerapkan otorisasi OAuth 2.0 untuk mengakses YouTube Data API dari aplikasi web JavaScript. OAuth 2.0 memungkinkan pengguna berbagi data tertentu dengan aplikasi, sekaligus tetap menjaga kerahasiaan nama pengguna, sandi, dan informasi lainnya. Misalnya, aplikasi dapat menggunakan OAuth 2.0 untuk mendapatkan izin mengupload video ke channel YouTube pengguna.
Alur OAuth 2.0 ini disebut alur pemberian implisit. Alur ini dirancang untuk aplikasi yang mengakses API hanya saat pengguna berada di aplikasi. Aplikasi ini tidak dapat menyimpan informasi rahasia.
Dalam alur ini, aplikasi Anda membuka URL Google yang menggunakan parameter kueri untuk mengidentifikasi aplikasi Anda dan jenis akses API yang diperlukan aplikasi. Anda dapat membuka URL di jendela browser saat ini atau dialog. Pengguna dapat melakukan autentikasi dengan Google dan memberikan izin yang diminta. Google kemudian mengalihkan pengguna kembali ke aplikasi Anda. Pengalihan ini menyertakan token akses, yang diverifikasi oleh aplikasi Anda, lalu digunakan untuk membuat permintaan API.
Library Klien Google API dan Layanan Identitas Google
Jika Anda menggunakan library klien Google API untuk JavaScript guna melakukan panggilan yang diotorisasi ke Google, Anda harus menggunakan library JavaScript Google Identity Services untuk menangani alur otorisasi. Sebaiknya gunakan model kode Google Identity Services, yang didasarkan pada alur kode otorisasi yang lebih aman dengan PKCE.
Prasyarat
Mengaktifkan API untuk project Anda
Setiap aplikasi yang memanggil Google API harus mengaktifkan API tersebut di Konsol API.
Untuk mengaktifkan API untuk project Anda:
- Buka Library API di Konsol API Google.
- Jika diminta, pilih project, atau buat project baru.
- Gunakan halaman Library untuk menemukan dan mengaktifkan YouTube Data API. Temukan API lain yang akan digunakan aplikasi Anda dan aktifkan juga API tersebut.
Membuat kredensial otorisasi
Setiap aplikasi yang menggunakan OAuth 2.0 untuk mengakses Google API harus memiliki kredensial otorisasi yang mengidentifikasi aplikasi ke server OAuth 2.0 Google. Langkah-langkah berikut menjelaskan cara membuat kredensial untuk project Anda. Kemudian, aplikasi Anda dapat menggunakan kredensial tersebut untuk mengakses API yang telah Anda aktifkan untuk project tersebut.
- Buka halaman Klien.
- Klik Create Client.
- Pilih jenis aplikasi aplikasi web.
- Isi formulir. Aplikasi yang menggunakan JavaScript untuk membuat permintaan Google API yang diizinkan harus menentukan origin JavaScript yang diizinkan. Origin mengidentifikasi domain tempat aplikasi Anda dapat mengirim permintaan ke server OAuth 2.0. Origin ini harus mematuhi aturan validasi Google.
Mengidentifikasi cakupan akses
Cakupan memungkinkan aplikasi Anda hanya meminta akses ke resource yang diperlukan sekaligus memungkinkan pengguna mengontrol jumlah akses yang mereka berikan ke aplikasi Anda. Oleh karena itu, mungkin ada hubungan terbalik antara jumlah cakupan yang diminta dan kemungkinan memperoleh izin pengguna.
Sebelum mulai menerapkan otorisasi OAuth 2.0, sebaiknya identifikasi cakupan yang memerlukan izin akses dari aplikasi Anda.
YouTube Data API v3 menggunakan cakupan berikut:
| Cakupan | Deskripsi |
|---|---|
https://www. |
Mengelola akun YouTube Anda |
https://www. |
Melihat daftar pelanggan yang saat ini aktif di channel Anda, level mereka saat ini, dan kapan mereka menjadi pelanggan |
https://www. |
Melihat, mengedit, dan secara permanen menghapus video, rating, komentar, dan teks YouTube |
https://www. |
Melihat akun YouTube Anda |
https://www. |
Mengelola video YouTube Anda |
https://www. |
Melihat dan mengelola aset Anda dan konten terkait di YouTube |
https://www. |
Melihat informasi pribadi channel YouTube Anda yang relevan selama proses audit bersama partner YouTube |
Dokumen Cakupan OAuth 2.0 API berisi daftar lengkap cakupan yang mungkin Anda gunakan untuk mengakses Google API.
Mendapatkan token akses OAuth 2.0
Langkah-langkah berikut menunjukkan cara aplikasi Anda berinteraksi dengan server OAuth 2.0 Google untuk mendapatkan izin pengguna dalam melakukan permintaan API atas nama pengguna. Aplikasi Anda harus memiliki izin tersebut sebelum dapat menjalankan permintaan Google API yang memerlukan otorisasi pengguna.
Langkah 1: Alihkan ke server OAuth 2.0 Google
Untuk meminta izin mengakses data pengguna, alihkan pengguna ke server OAuth 2.0 Google.
Endpoint OAuth 2.0
Buat URL untuk meminta akses dari endpoint OAuth 2.0 Google di
https://accounts.google.com/o/oauth2/v2/auth. Endpoint ini dapat diakses melalui HTTPS; koneksi HTTP biasa akan ditolak.
Server otorisasi Google mendukung parameter string kueri berikut untuk aplikasi server web:
| Parameter | |||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
client_id |
Wajib
Client ID untuk aplikasi Anda. Anda dapat menemukan nilai ini di halaman Klien Konsol Cloud. |
||||||||||||||||
redirect_uri |
Wajib
Menentukan tempat server API mengalihkan pengguna setelah pengguna menyelesaikan alur otorisasi. Nilai harus sama persis dengan salah satu URI pengalihan yang diizinkan untuk klien OAuth 2.0, yang Anda konfigurasi di halaman Klien Konsol Cloud klien Anda. Jika nilai ini tidak cocok dengan URI pengalihan yang diizinkan untuk Perhatikan bahwa skema |
||||||||||||||||
response_type |
Wajib
Aplikasi JavaScript perlu menetapkan nilai parameter ke |
||||||||||||||||
scope |
Wajib
Daftar cakupan yang dipisahkan spasi yang mengidentifikasi resource yang dapat diakses aplikasi Anda atas nama pengguna. Nilai ini menginformasikan layar izin yang ditampilkan Google kepada pengguna. Cakupan memungkinkan aplikasi Anda hanya meminta akses ke resource yang diperlukan, sekaligus memungkinkan pengguna mengontrol jumlah akses yang mereka berikan ke aplikasi Anda. Oleh karena itu, ada hubungan terbalik antara jumlah cakupan yang diminta dan kemungkinan mendapatkan izin pengguna. YouTube Data API v3 menggunakan cakupan berikut:
Dokumen Cakupan OAuth 2.0 API menyediakan daftar lengkap cakupan yang mungkin Anda gunakan untuk mengakses Google API. Sebaiknya aplikasi Anda meminta akses ke cakupan otorisasi dalam konteks jika memungkinkan. Dengan meminta akses ke data pengguna sesuai konteks, menggunakan otorisasi inkremental, Anda membantu pengguna memahami alasan aplikasi Anda memerlukan akses yang diminta. |
||||||||||||||||
state |
Direkomendasikan
Menentukan nilai string apa pun yang digunakan aplikasi Anda untuk mempertahankan status antara permintaan otorisasi dan respons server otorisasi.
Server menampilkan nilai persis yang Anda kirim sebagai pasangan Anda dapat menggunakan parameter ini untuk beberapa tujuan, seperti mengarahkan pengguna ke
resource yang benar dalam aplikasi Anda, mengirim nonce, dan mengurangi pemalsuan permintaan
lintas situs. Karena |
||||||||||||||||
include_granted_scopes |
Opsional
Memungkinkan aplikasi menggunakan otorisasi inkremental untuk meminta akses ke cakupan tambahan dalam konteks. Jika Anda menetapkan nilai parameter ini ke |
||||||||||||||||
enable_granular_consent |
Opsional
Default-nya adalah Saat Google mengaktifkan izin terperinci untuk aplikasi, parameter ini tidak akan berpengaruh lagi. |
||||||||||||||||
login_hint |
Opsional
Jika aplikasi Anda mengetahui pengguna mana yang mencoba melakukan autentikasi, aplikasi tersebut dapat menggunakan parameter ini untuk memberikan petunjuk ke Server Autentikasi Google. Server menggunakan petunjuk untuk menyederhanakan alur login, baik dengan mengisi otomatis kolom email di formulir login maupun dengan memilih sesi multi-login yang sesuai. Tetapkan nilai parameter ke alamat email atau ID |
||||||||||||||||
prompt |
Opsional
Daftar perintah yang dipisahkan spasi dan peka huruf besar/kecil untuk ditampilkan kepada pengguna. Jika Anda tidak menentukan parameter ini, pengguna hanya akan diminta saat pertama kali project Anda meminta akses. Lihat Meminta izin ulang untuk mengetahui informasi selengkapnya. Nilai yang dimungkinkan adalah:
|
||||||||||||||||
Contoh pengalihan ke server otorisasi Google
Contoh URL di bawah meminta akses offline
(access_type=offline) ke cakupan yang mengizinkan akses untuk melihat
akun YouTube pengguna. Library ini menggunakan otorisasi inkremental untuk memastikan bahwa
token akses baru mencakup cakupan apa pun yang sebelumnya diberikan akses aplikasi oleh pengguna. URL juga menetapkan nilai untuk parameter
redirect_uri, response_type, dan
client_id yang diperlukan serta untuk parameter
state. URL berisi baris baru dan spasi agar lebih mudah dibaca.
https://accounts.google.com/o/oauth2/v2/auth?
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
include_granted_scopes=true&
state=state_parameter_passthrough_value&
redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
response_type=token&
client_id=client_idSetelah Anda membuat URL permintaan, alihkan pengguna ke URL tersebut.
Kode contoh JavaScript
Cuplikan JavaScript berikut menunjukkan cara memulai alur otorisasi di JavaScript tanpa menggunakan Library Klien Google API untuk JavaScript. Karena endpoint OAuth 2.0 ini tidak mendukung Cross-Origin Resource Sharing (CORS), cuplikan ini membuat formulir yang membuka permintaan ke endpoint tersebut.
/* * 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_REDIRECT_URI', 'response_type': 'token', 'scope': 'https://www.googleapis.com/auth/youtube.force-ssl', '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(); }
Langkah 2: Google meminta izin pengguna
Pada langkah ini, pengguna memutuskan apakah akan memberikan akses yang diminta ke aplikasi Anda. Pada tahap ini, Google menampilkan jendela izin yang menunjukkan nama aplikasi Anda dan layanan Google API yang meminta izin untuk diakses dengan kredensial otorisasi pengguna dan ringkasan cakupan akses yang akan diberikan. Pengguna kemudian dapat mengizinkan untuk memberikan akses ke satu atau beberapa cakupan yang diminta oleh aplikasi Anda atau menolak permintaan tersebut.
Aplikasi Anda tidak perlu melakukan apa pun pada tahap ini karena aplikasi menunggu respons dari server OAuth 2.0 Google yang menunjukkan apakah akses diberikan. Respons tersebut dijelaskan di langkah berikut.
Error
Permintaan ke endpoint otorisasi OAuth 2.0 Google dapat menampilkan pesan error yang ditampilkan kepada pengguna, bukan alur autentikasi dan otorisasi yang diharapkan. Kode error umum dan resolusi yang disarankan adalah:
admin_policy_enforced
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 mana yang dapat 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 client ID OAuth Anda.
disallowed_useragent
Endpoint otorisasi ditampilkan di dalam agen pengguna tersemat yang tidak diizinkan oleh Kebijakan OAuth 2.0 Google.
Developer iOS dan macOS mungkin mengalami error ini saat membuka permintaan otorisasi di
WKWebView.
Developer harus menggunakan library iOS seperti
Login dengan Google untuk iOS atau
AppAuth untuk iOS dari OpenID Foundation.
Developer web mungkin mengalami error ini saat aplikasi iOS atau macOS membuka link web umum di
agen pengguna tersemat dan pengguna membuka endpoint otorisasi OAuth 2.0 Google dari
situs Anda. Developer harus mengizinkan link umum dibuka di pengendali link default
sistem operasi, yang mencakup pengendali
Link Universal
atau aplikasi browser default. Library
SFSafariViewController
juga merupakan opsi yang didukung.
org_internal
Client ID OAuth dalam permintaan adalah bagian dari project yang membatasi akses ke Akun Google di Organisasi Google Cloud tertentu. Untuk mengetahui informasi selengkapnya tentang opsi konfigurasi ini, lihat bagian Jenis pengguna di artikel bantuan Menyiapkan layar izin OAuth.
invalid_client
Asal permintaan tidak diizinkan untuk klien ini. Lihat
origin_mismatch.
deleted_client
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 .
invalid_grant
Saat menggunakan otorisasi inkremental, token mungkin telah habis masa berlakunya atau telah dibatalkan. Autentikasi pengguna lagi dan minta izin pengguna untuk mendapatkan token baru. Jika Anda terus melihat error ini, pastikan aplikasi Anda telah dikonfigurasi dengan benar dan Anda menggunakan token dan parameter yang benar dalam permintaan Anda. Jika tidak, akun pengguna mungkin telah dihapus atau dinonaktifkan.
origin_mismatch
Skema, domain, dan/atau port JavaScript yang memulai permintaan otorisasi mungkin tidak cocok dengan URI asal JavaScript yang diizinkan dan terdaftar untuk client ID OAuth. Tinjau origin JavaScript yang diizinkan di halaman Klien Konsol Google Cloud.
redirect_uri_mismatch
redirect_uri yang diteruskan dalam permintaan otorisasi tidak cocok dengan URI pengalihan yang diizinkan untuk client ID OAuth. Tinjau URI pengalihan yang diotorisasi di
halaman Klien
Konsol Google Cloud.
Skema, domain, dan/atau port JavaScript yang memulai permintaan otorisasi mungkin tidak cocok dengan URI asal JavaScript yang diizinkan dan terdaftar untuk client ID OAuth. Tinjau origin JavaScript yang diizinkan di halaman Klien Konsol Google Cloud.
Parameter redirect_uri dapat merujuk ke alur out-of-band (OOB) OAuth yang tidak digunakan lagi dan tidak didukung lagi. Lihat
panduan migrasi untuk mengupdate
integrasi Anda.
invalid_request
Terjadi error pada permintaan yang Anda buat. Hal ini dapat disebabkan oleh beberapa alasan:
- Permintaan tidak diformat dengan benar
- Permintaan tidak memiliki parameter yang diperlukan
- Permintaan tersebut menggunakan metode otorisasi yang tidak didukung oleh Google. Memverifikasi bahwa integrasi OAuth Anda menggunakan metode integrasi yang direkomendasikan
Langkah 3: Tangani respons server OAuth 2.0
Endpoint OAuth 2.0
Server OAuth 2.0 mengirimkan respons ke redirect_uri yang ditentukan dalam permintaan token akses Anda.
Jika pengguna menyetujui permintaan, respons akan berisi token akses. Jika pengguna tidak menyetujui permintaan tersebut, respons akan berisi pesan error. Token akses atau pesan error ditampilkan pada fragmen hash URI pengalihan, seperti yang ditunjukkan dalam contoh berikut:
Respons token akses:
https://oauth2.example.com/callback#access_token=4/P7q7W91&token_type=Bearer&expires_in=3600
Selain parameter
access_token, string fragmen juga berisi parametertoken_type, yang selalu ditetapkan keBearer, dan parameterexpires_in, yang menentukan masa aktif token, dalam detik. Jika parameterstateditentukan dalam permintaan token akses, nilainya juga disertakan dalam respons.- Respons error:
https://oauth2.example.com/callback#error=access_denied
Contoh respons server OAuth 2.0
Anda dapat menguji alur ini dengan mengklik contoh URL berikut, yang meminta akses hanya baca untuk melihat metadata file di Google Drive Anda dan akses hanya baca untuk melihat acara Google Kalender Anda:
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly& include_granted_scopes=true& state=state_parameter_passthrough_value& redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback& response_type=token& client_id=client_id
Setelah menyelesaikan alur OAuth 2.0, browser akan mengalihkan Anda ke OAuth 2.0 Playground, alat untuk menguji alur OAuth. Anda akan melihat bahwa OAuth 2.0 Playground telah otomatis mengambil kode otorisasi.
Langkah 4: Periksa cakupan yang diberikan pengguna
Saat meminta beberapa izin (cakupan), pengguna mungkin tidak memberikan akses ke semua izin tersebut kepada aplikasi Anda. Aplikasi Anda harus memverifikasi cakupan mana yang benar-benar diberikan dan menangani situasi saat beberapa izin ditolak dengan baik, biasanya dengan menonaktifkan fitur yang mengandalkan cakupan yang ditolak tersebut.
Namun, terdapat pengecualian. Aplikasi Google Workspace Enterprise dengan delegasi otoritas di seluruh domain, atau aplikasi yang ditandai sebagai Tepercaya, akan mengabaikan layar izin terperinci. Untuk aplikasi ini, pengguna tidak akan melihat layar izin terperinci. Sebagai gantinya, aplikasi Anda akan menerima semua cakupan yang diminta atau tidak sama sekali.
Untuk informasi yang lebih mendetail, lihat Cara menangani izin terperinci.
Endpoint OAuth 2.0
Untuk memeriksa apakah pengguna telah memberi aplikasi Anda akses ke cakupan tertentu,
periksa kolom scope dalam respons token akses. Cakupan akses yang diberikan oleh
access_token yang dinyatakan sebagai daftar string yang dipisahkan spasi dan peka huruf besar/kecil.
Misalnya, contoh respons token akses berikut menunjukkan bahwa pengguna telah memberikan izin kepada aplikasi Anda untuk melihat, mengedit, dan menghapus secara permanen video YouTube, rating, komentar, dan teks pengguna:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/youtube.force-ssl", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Memanggil Google API
Endpoint OAuth 2.0
Setelah aplikasi Anda mendapatkan token akses, Anda dapat menggunakan token tersebut untuk melakukan panggilan ke Google API atas nama akun pengguna tertentu jika cakupan akses yang diperlukan oleh API telah diberikan. Untuk melakukannya, sertakan
token akses dalam permintaan ke API dengan menyertakan parameter kueri access_token
atau nilai Bearer header HTTP Authorization. Jika memungkinkan,
header HTTP lebih disarankan, karena string kueri cenderung terlihat di log server. Pada umumnya,
Anda dapat menggunakan library klien untuk menyiapkan panggilan ke Google API (misalnya, saat
memanggil YouTube Data API).
Perhatikan bahwa YouTube Data API hanya mendukung akun layanan untuk pemilik konten YouTube yang memiliki dan mengelola beberapa channel YouTube, seperti label rekaman dan studio film.
Anda dapat mencoba semua Google API dan melihat cakupannya di OAuth 2.0 Playground.
Contoh HTTP GET
Panggilan ke endpoint
youtube.channels (YouTube Data API) menggunakan header HTTP Authorization: Bearer mungkin terlihat seperti berikut. Perhatikan bahwa Anda harus menentukan token akses Anda sendiri:
GET /youtube/v3/channels?part=snippet&mine=true 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/youtube/v3/channels?access_token=access_token&part=snippet&mine=true
Contoh curl
Anda dapat menguji perintah ini dengan aplikasi command line curl. Berikut adalah contoh yang menggunakan opsi header HTTP (lebih disukai):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true
Atau, opsi parameter string kueri:
curl https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true
Kode contoh JavaScript
Cuplikan kode di bawah menunjukkan cara menggunakan CORS (Cross-origin resource sharing) untuk mengirim permintaan ke Google API. Contoh ini tidak menggunakan Library Klien Google API untuk JavaScript. Namun, meskipun Anda tidak menggunakan library klien, panduan dukungan CORS dalam dokumentasi library tersebut kemungkinan akan membantu Anda lebih memahami permintaan ini.
Dalam cuplikan kode ini, variabel access_token mewakili token yang telah Anda
peroleh untuk membuat permintaan API atas nama pengguna yang diberi otorisasi. Contoh
lengkap menunjukkan cara menyimpan token tersebut di penyimpanan lokal browser dan mengambilnya
saat membuat permintaan API.
var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true&' + 'access_token=' + params['access_token']); xhr.onreadystatechange = function (e) { console.log(xhr.response); }; xhr.send(null);
Contoh lengkap
Endpoint OAuth 2.0
Contoh kode ini menunjukkan cara menyelesaikan alur OAuth 2.0 di JavaScript tanpa menggunakan Library Klien Google API untuk JavaScript. Kode ini ditujukan untuk halaman HTML yang menampilkan tombol untuk mencoba permintaan API. Jika Anda mengklik tombol, kode akan memeriksa apakah halaman telah menyimpan token akses API di penyimpanan lokal browser Anda. Jika ya, permintaan API akan dijalankan. Jika tidak, alur OAuth 2.0 akan dimulai.
Untuk alur OAuth 2.0, halaman ini mengikuti langkah-langkah berikut:
- Tindakan ini mengarahkan pengguna ke server OAuth 2.0 Google, yang meminta akses ke cakupan
https://www.googleapis.com/auth/youtube.force-ssl. - Setelah memberikan (atau menolak) akses ke satu atau beberapa cakupan yang diminta, pengguna akan dialihkan ke halaman asli, yang mengurai token akses dari string ID fragmen.
- Halaman ini memeriksa cakupan mana yang telah diberikan akses oleh pengguna ke aplikasi.
Jika pengguna telah memberikan akses ke cakupan yang diminta, halaman akan menggunakan token akses untuk membuat contoh permintaan API.
Permintaan API ini memanggil metode
channels.listYouTube Data API untuk mengambil data tentang channel YouTube pengguna yang diberi otorisasi.- Jika permintaan berhasil dijalankan, respons API akan dicatat dalam konsol proses debug browser.
Anda dapat mencabut akses ke aplikasi melalui halaman Izin untuk Akun Google Anda. Aplikasi ini tercantum sebagai nama aplikasi yang diberikan di halaman branding dalam layar izin OAuth selama pembuatan client ID.
Untuk menjalankan kode ini secara lokal, Anda harus menetapkan nilai untuk variabel YOUR_CLIENT_ID dan YOUR_REDIRECT_URI yang sesuai dengan kredensial otorisasi Anda. Variabel YOUR_REDIRECT_URI
harus ditetapkan ke URL yang sama dengan tempat halaman ditayangkan. Nilai harus sama persis dengan salah satu URI pengalihan yang diizinkan untuk klien OAuth 2.0, yang Anda konfigurasi di halaman Klien Konsol Cloud. Jika
nilai ini tidak cocok dengan URI yang diizinkan, Anda akan mendapatkan error
redirect_uri_mismatch. Project Anda juga harus
mengaktifkan API yang sesuai untuk permintaan ini.
<html><head></head><body>
<script>
var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';
// Parse query string to see if page request is coming from OAuth 2.0 server.
var fragmentString = location.hash.substring(1);
var params = {};
var regex = /([^&=]+)=([^&]*)/g, m;
while (m = regex.exec(fragmentString)) {
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
}
if (Object.keys(params).length > 0 && params['state']) {
if (params['state'] == localStorage.getItem('state')) {
localStorage.setItem('oauth2-test-params', JSON.stringify(params) );
trySampleRequest();
} else {
console.log('State mismatch. Possible CSRF attack');
}
}
// Function to generate a random state value
function generateCryptoRandomState() {
const randomValues = new Uint32Array(2);
window.crypto.getRandomValues(randomValues);
// Encode as UTF-8
const utf8Encoder = new TextEncoder();
const utf8Array = utf8Encoder.encode(
String.fromCharCode.apply(null, randomValues)
);
// Base64 encode the UTF-8 data
return btoa(String.fromCharCode.apply(null, utf8Array))
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
}
// 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/youtube/v3/channels?part=snippet&mine=true&' +
'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() {
// create random state value and store in local storage
var state = generateCryptoRandomState();
localStorage.setItem('state', state);
// 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/youtube.force-ssl',
'state': state,
'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>Aturan validasi origin JavaScript
Google menerapkan aturan validasi berikut ke origin JavaScript untuk membantu developer menjaga keamanan aplikasi mereka. Origin JavaScript Anda harus mematuhi aturan ini. Lihat RFC 3986 bagian 3 untuk mengetahui definisi domain, host, dan skema, yang digunakan dalam aturan ini.
| Aturan validasi | |
|---|---|
| Skema |
Asal JavaScript harus menggunakan skema HTTPS, bukan HTTP biasa. URI localhost (termasuk URI alamat IP localhost) dikecualikan dari aturan ini. |
| Host |
Host tidak boleh berupa alamat IP mentah. Alamat IP localhost dikecualikan dari aturan ini. |
| Domain |
“googleusercontent.com”.goo.gl)
kecuali jika aplikasi memiliki domain tersebut. |
| Userinfo |
Origin JavaScript tidak boleh berisi subkomponen userinfo. |
| Path |
Origin JavaScript tidak boleh berisi komponen jalur. |
| Kueri |
Asal JavaScript tidak boleh berisi komponen kueri. |
| Fragment |
Origin JavaScript tidak boleh berisi komponen fragmen. |
| Karakter |
Origin JavaScript tidak boleh berisi karakter tertentu, termasuk:
|
Otorisasi inkremental
Dalam protokol OAuth 2.0, aplikasi Anda meminta otorisasi untuk mengakses resource, yang diidentifikasi berdasarkan cakupan. Praktik terbaik pengalaman pengguna adalah meminta otorisasi untuk resource pada saat Anda membutuhkannya. Untuk mengaktifkan praktik tersebut, server otorisasi Google mendukung otorisasi inkremental. Fitur ini memungkinkan Anda meminta cakupan sesuai kebutuhan dan, jika pengguna memberikan izin untuk cakupan baru, menampilkan kode otorisasi yang dapat ditukarkan dengan token yang berisi semua cakupan yang telah diberikan pengguna ke project.
Misalnya, sebuah aplikasi membantu pengguna mengidentifikasi acara lokal yang menarik. Aplikasi ini memungkinkan pengguna melihat video tentang acara, memberi rating pada video, dan menambahkan video ke playlist. Pengguna juga dapat menggunakan aplikasi untuk menambahkan acara ke Google Kalender mereka.
Dalam hal ini, pada saat login, aplikasi mungkin tidak memerlukan atau meminta akses ke
cakupan apa pun. Namun, jika pengguna mencoba memberi rating pada video, menambahkan video ke
playlist, atau melakukan tindakan YouTube lainnya, aplikasi dapat meminta akses ke
cakupan https://www.googleapis.com/auth/youtube.force-ssl.
Demikian pula, aplikasi dapat meminta akses ke
cakupan https://www.googleapis.com/auth/calendar jika pengguna mencoba
menambahkan acara kalender.
Aturan berikut berlaku untuk token akses yang diperoleh dari otorisasi inkremental:
- Token ini dapat digunakan untuk mengakses resource yang sesuai dengan cakupan mana pun yang digabungkan ke dalam otorisasi gabungan yang baru.
- Saat Anda menggunakan token refresh untuk otorisasi gabungan guna mendapatkan token akses, token akses tersebut mewakili otorisasi gabungan dan dapat digunakan untuk nilai
scopeapa pun yang disertakan dalam respons. - Otorisasi gabungan mencakup semua cakupan yang diberikan pengguna ke project API meskipun izin tersebut diminta dari klien yang berbeda. Misalnya, jika pengguna memberikan akses ke satu cakupan menggunakan klien desktop aplikasi, lalu memberikan cakupan lain ke aplikasi yang sama melalui klien seluler, otorisasi gabungan akan menyertakan kedua cakupan tersebut.
- Jika Anda mencabut token yang mewakili otorisasi gabungan, akses ke semua cakupan otorisasi tersebut atas nama pengguna terkait akan dicabut secara bersamaan.
Contoh kode di bawah menunjukkan cara menambahkan cakupan ke token akses yang ada. Dengan pendekatan ini, aplikasi Anda tidak perlu mengelola beberapa token akses.
Endpoint OAuth 2.0
Dalam contoh ini, aplikasi yang memanggil meminta akses untuk mengambil data YouTube Analytics pengguna selain akses lain yang telah diberikan pengguna ke aplikasi.
Untuk menambahkan cakupan ke token akses yang ada, sertakan parameter include_granted_scopes
dalam permintaan Anda ke server OAuth 2.0 Google.
Cuplikan kode berikut menunjukkan cara melakukannya. Cuplikan ini mengasumsikan bahwa Anda telah menyimpan cakupan yang valid untuk token akses Anda di penyimpanan lokal browser. (Kode
contoh lengkap menyimpan daftar cakupan yang token aksesnya
valid dengan menetapkan properti oauth2-test-params.scope di penyimpanan lokal
browser.)
Cuplikan ini membandingkan cakupan yang valid untuk token akses dengan cakupan yang ingin Anda gunakan
untuk kueri tertentu. Jika token akses tidak mencakup cakupan tersebut, alur OAuth 2.0 akan dimulai.
Di sini, fungsi oauth2SignIn sama dengan yang disediakan di
langkah 2 (dan yang disediakan nanti dalam contoh
lengkap).
var SCOPE = 'https://www.googleapis.com/auth/youtube.force-ssl'; var params = JSON.parse(localStorage.getItem('oauth2-test-params')); var current_scope_granted = false; if (params.hasOwnProperty('scope')) { var scopes = params['scope'].split(' '); for (var s = 0; s < scopes.length; s++) { if (SCOPE == scopes[s]) { current_scope_granted = true; } } } if (!current_scope_granted) { oauth2SignIn(); // This function is defined elsewhere in this document. } else { // Since you already have access, you can proceed with the API request. }
Pencabutan token
Dalam beberapa kasus, pengguna mungkin ingin mencabut akses yang diberikan ke aplikasi. Pengguna dapat mencabut akses dengan membuka Setelan Akun. Lihat bagian Menghapus akses situs atau aplikasi di Situs & aplikasi pihak ketiga yang memiliki akses ke akun Anda dalam dokumen dukungan untuk mengetahui informasi selengkapnya.
Aplikasi juga dapat mencabut akses yang diberikan kepadanya secara terprogram. Pencabutan terprogram penting dalam situasi saat pengguna berhenti berlangganan, menghapus aplikasi, atau resource API yang diperlukan oleh aplikasi telah berubah secara signifikan. Dengan kata lain, bagian dari proses penghapusan dapat mencakup permintaan API untuk memastikan izin yang sebelumnya diberikan ke aplikasi dihapus.
Endpoint OAuth 2.0
Untuk mencabut token secara terprogram, aplikasi Anda membuat permintaan ke
https://oauth2.googleapis.com/revoke dan menyertakan token sebagai parameter:
curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
https://oauth2.googleapis.com/revoke?token={token}Token dapat berupa token akses atau token refresh. Jika token tersebut adalah token akses dan memiliki token refresh yang sesuai, token refresh juga akan dicabut.
Jika pencabutan berhasil diproses, kode status HTTP responsnya adalah
200. Untuk kondisi error, kode status HTTP 400 ditampilkan bersama
dengan kode error.
Cuplikan JavaScript berikut menunjukkan cara mencabut token di JavaScript tanpa menggunakan
Library Klien Google API untuk JavaScript. Karena endpoint OAuth 2.0 Google untuk mencabut token tidak mendukung Cross-origin Resource Sharing (CORS), kode akan membuat formulir dan mengirimkan formulir ke endpoint, bukan menggunakan metode XMLHttpRequest() untuk memposting permintaan.
function revokeAccess(accessToken) { // Google's OAuth 2.0 endpoint for revoking access tokens. var revokeTokenEndpoint = 'https://oauth2.googleapis.com/revoke'; // Create <form> element to use to POST data to the OAuth 2.0 endpoint. var form = document.createElement('form'); form.setAttribute('method', 'post'); form.setAttribute('action', revokeTokenEndpoint); // Add access token to the form so it is set as value of 'token' parameter. // This corresponds to the sample curl request, where the URL is: // https://oauth2.googleapis.com/revoke?token={token} var tokenField = document.createElement('input'); tokenField.setAttribute('type', 'hidden'); tokenField.setAttribute('name', 'token'); tokenField.setAttribute('value', accessToken); form.appendChild(tokenField); // Add form to page and submit it to actually revoke the token. document.body.appendChild(form); form.submit(); }
Menerapkan Perlindungan Lintas Akun
Langkah tambahan yang harus Anda lakukan untuk melindungi akun pengguna adalah menerapkan Perlindungan Lintas Akun dengan memanfaatkan Layanan Perlindungan Lintas Akun Google. Layanan ini memungkinkan Anda berlangganan notifikasi peristiwa keamanan yang memberikan informasi kepada aplikasi 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.