Dokumen ini menjelaskan bagaimana aplikasi server web menggunakan Library Klien Google API atau Google Endpoint OAuth 2.0 untuk menerapkan otorisasi OAuth 2.0 untuk mengakses Google API.
OAuth 2.0 memungkinkan pengguna untuk berbagi data tertentu dengan aplikasi sambil tetap mempertahankan nama pengguna, {i>password<i}, dan informasi lainnya secara rahasia. Misalnya, aplikasi dapat menggunakan OAuth 2.0 untuk mendapatkan izin dari pengguna untuk menyimpan file di Google Drive mereka.
Alur OAuth 2.0 ini khusus untuk otorisasi pengguna. Ia dirancang untuk aplikasi yang dapat menyimpan informasi rahasia dan menjaga status. Server web yang diberi otorisasi dengan benar aplikasi dapat mengakses API saat pengguna berinteraksi dengan aplikasi atau setelah pengguna telah keluar dari aplikasi.
Aplikasi server web juga sering menggunakan akun layanan untuk mengizinkan permintaan API, terutama saat memanggil Cloud API untuk mengakses data berbasis proyek, bukan data spesifik pengguna. Aplikasi server web dapat menggunakan layanan akun bersama dengan otorisasi pengguna.
Library klien
Contoh spesifik per bahasa di halaman ini menggunakan Library Klien Google API yang akan diimplementasikan Otorisasi OAuth 2.0. Untuk menjalankan contoh kode, Anda terlebih dahulu harus menginstal library klien untuk bahasa Anda.
Saat Anda menggunakan Library Klien Google API untuk menangani alur OAuth 2.0 aplikasi Anda, library melakukan banyak tindakan yang seharusnya perlu ditangani sendiri oleh aplikasi. Sebagai contoh ini menentukan kapan aplikasi dapat menggunakan atau memperbarui token akses yang disimpan, serta kapan aplikasi harus mendapatkan kembali izin. Library klien juga menghasilkan pengalihan yang benar dan membantu menerapkan pengendali pengalihan yang menukar kode otorisasi untuk token akses.
Library Klien Google API untuk aplikasi sisi server tersedia untuk bahasa berikut:
Prasyarat
Mengaktifkan API untuk project Anda
Aplikasi apa pun yang memanggil Google API harus mengaktifkan API tersebut di API Console.
Untuk mengaktifkan API project Anda:
- Open the API Library di Google API Console.
- If prompted, select a project, or create a new one.
- API Library mencantumkan semua API yang tersedia, yang dikelompokkan menurut produk keluarga dan popularitas. Jika API yang ingin Anda aktifkan tidak terlihat dalam daftar, gunakan penelusuran untuk temukan, atau klik Lihat Semua di kategori produknya.
- Pilih API yang ingin Anda aktifkan, lalu klik tombol Aktifkan.
- If prompted, enable billing.
- If prompted, read and accept the API's Terms of Service.
Membuat kredensial otorisasi
Aplikasi apa pun 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. Selanjutnya, aplikasi Anda dapat menggunakan kredensial tersebut untuk mengakses API yang telah Anda aktifkan untuk project tersebut.
- Go to the Credentials page.
- Klik Create credentials > Client ID OAuth yang baru.
- Pilih jenis aplikasi Web application.
- Isi formulir, lalu klik Buat. Aplikasi yang menggunakan bahasa dan framework
seperti PHP, Java, Python, Ruby, dan .NET harus menentukan URI pengalihan yang diotorisasi. Tujuan
URI pengalihan adalah endpoint tempat server OAuth 2.0 dapat mengirim respons. Ini
endpoint harus mematuhi aturan validasi Google.
Untuk pengujian, Anda bisa menetapkan URI yang mengacu pada mesin lokal, seperti
http://localhost:8080
. Dengan mengingat hal itu, perhatikan bahwa semua contoh dalam dokumen ini menggunakanhttp://localhost:8080
sebagai URI pengalihan.Sebaiknya desain endpoint autentikasi aplikasi Anda agar aplikasi Anda tidak mengekspos kode otorisasi ke resource lain di kami.
Setelah membuat kredensial, download file client_secret.json dari API Console. Simpan file dengan aman di lokasi yang hanya yang dapat diakses oleh aplikasi Anda.
Mengidentifikasi cakupan akses
Dengan cakupan, aplikasi Anda dapat hanya meminta akses ke resource yang diperlukannya sekaligus memungkinkan pengguna untuk mengontrol jumlah akses yang mereka berikan ke aplikasi Anda. Oleh karena itu, mungkin merupakan hubungan terbalik antara jumlah cakupan yang diminta dan kemungkinan mendapatkan izin pengguna.
Sebelum mulai menerapkan otorisasi OAuth 2.0, sebaiknya Anda mengidentifikasi cakupan aplikasi Anda memerlukan izin untuk mengaksesnya.
Sebaiknya aplikasi Anda juga meminta akses ke cakupan otorisasi melalui proses otorisasi inkremental, di mana aplikasi Anda meminta akses ke data pengguna dalam konteks. Praktik terbaik ini membantu pengguna untuk lebih mudah memahami mengapa aplikasi Anda membutuhkan akses yang dimintanya.
Dokumen Cakupan OAuth 2.0 API berisi daftar cakupan yang dapat Anda gunakan untuk mengakses Google API.
Persyaratan spesifik per bahasa
Untuk menjalankan salah satu contoh kode dalam dokumen ini, Anda memerlukan akun Google, akses ke Internet, dan {i>browser<i} web. Jika Anda menggunakan salah satu library klien API, lihat juga persyaratan spesifik per bahasa di bawah.
PHP
Untuk menjalankan contoh kode PHP dalam dokumen ini, Anda akan memerlukan:
- PHP 5.6 atau yang lebih baru dengan antarmuka command line (CLI) dan ekstensi JSON yang terinstal.
- Alat pengelolaan dependensi Composer.
-
Library Klien Google API untuk PHP:
composer require google/apiclient:^2.10
Python
Untuk menjalankan contoh kode Python dalam dokumen ini, Anda akan memerlukan:
- Python 2.6 atau yang lebih baru
- Alat pengelolaan paket pip.
- Library Klien Google API untuk Python:
pip install --upgrade google-api-python-client
google-auth
,google-auth-oauthlib
, dangoogle-auth-httplib2
untuk otorisasi pengguna.pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
- Framework aplikasi web Flask Python.
pip install --upgrade flask
- Library HTTP
requests
.pip install --upgrade requests
Ruby
Untuk menjalankan contoh kode Ruby dalam dokumen ini, Anda akan memerlukan:
- Ruby 2.6 atau yang lebih baru
-
Library Google Auth untuk Ruby:
gem install googleauth
-
Framework aplikasi web Sinatra Ruby.
gem install sinatra
Node.js
Untuk menjalankan contoh kode Node.js dalam dokumen ini, Anda akan memerlukan:
- LTS pemeliharaan, LTS aktif, atau rilis Node.js saat ini.
-
Klien Node.js Google API:
npm install googleapis crypto express express-session
HTTP/REST
Anda tidak perlu menginstal library apa pun agar dapat langsung memanggil OAuth 2.0 endpoint.
Mendapatkan token akses OAuth 2.0
Langkah-langkah berikut menunjukkan cara aplikasi Anda berinteraksi dengan server OAuth 2.0 Google untuk mendapatkan izin pengguna untuk melakukan permintaan API atas nama pengguna. Permohonan Anda harus memiliki izin sebelum dapat mengeksekusi permintaan Google API yang memerlukan otorisasi pengguna.
Daftar di bawah ini merangkum langkah-langkah ini dengan cepat:
- Aplikasi Anda mengidentifikasi izin yang diperlukan.
- Aplikasi Anda mengalihkan pengguna ke Google bersama dengan daftar permintaan izin akses.
- Pengguna memutuskan apakah akan memberikan izin ke aplikasi Anda atau tidak.
- Aplikasi Anda mencari tahu apa yang dipilih pengguna.
- Jika pengguna memberikan izin yang diminta, aplikasi Anda mengambil token yang diperlukan untuk membuat permintaan API atas nama pengguna.
Langkah 1: Tetapkan parameter otorisasi
Langkah pertama Anda adalah membuat permintaan otorisasi. Permintaan tersebut menetapkan parameter yang mengidentifikasi aplikasi Anda dan menetapkan izin yang harus diberikan kepada pengguna aplikasi Anda.
- Jika Anda menggunakan library klien Google untuk autentikasi dan otorisasi OAuth 2.0, membuat dan mengonfigurasi objek yang mendefinisikan parameter ini.
- Jika Anda memanggil endpoint Google OAuth 2.0 secara langsung, Anda akan membuat URL dan menetapkan parameter pada URL tersebut.
Tab di bawah menentukan parameter otorisasi yang didukung untuk aplikasi server web. Tujuan contoh spesifik bahasa juga menunjukkan cara menggunakan pustaka klien atau {i>library<i} otorisasi untuk mengonfigurasi objek yang menetapkan parameter tersebut.
PHP
Cuplikan kode di bawah ini membuat objek Google\Client()
, yang menentukan
di dalam permintaan otorisasi.
Objek tersebut menggunakan informasi dari file client_secret.json Anda untuk mengidentifikasi
aplikasi. (Lihat membuat kredensial otorisasi untuk informasi selengkapnya tentang
file tersebut.) Objek ini juga mengidentifikasi cakupan yang dimintai izin oleh aplikasi Anda
dan URL ke endpoint autentikasi aplikasi Anda, yang akan menangani respons dari
Server OAuth 2.0 Google. Terakhir, kode ini menetapkan access_type
opsional dan
Parameter include_granted_scopes
.
Misalnya, kode ini meminta akses hanya baca dan offline ke server Google Drive:
$client = new Google\Client(); // Required, call the setAuthConfig function to load authorization credentials from // client_secret.json file. $client->setAuthConfig('client_secret.json'); // Required, to set the scope value, call the addScope function $client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY); // Required, call the setRedirectUri function to specify a valid redirect URI for the // provided client_id $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'); // Recommended, offline access will give you both an access and refresh token so that // your app can refresh the access token without user interaction. $client->setAccessType('offline'); // Recommended, call the setState function. Using a state value can increase your assurance that // an incoming connection is the result of an authentication request. $client->setState($sample_passthrough_value); // Optional, if your application knows which user is trying to authenticate, it can use this // parameter to provide a hint to the Google Authentication Server. $client->setLoginHint('[email protected]'); // Optional, call the setPrompt function to set "consent" will prompt the user for consent $client->setPrompt('consent'); // Optional, call the setIncludeGrantedScopes function with true to enable incremental // authorization $client->setIncludeGrantedScopes(true);
Python
Cuplikan kode berikut menggunakan modul google-auth-oauthlib.flow
untuk membuat
permintaan otorisasi.
Kode ini membuat objek Flow
yang mengidentifikasi aplikasi Anda menggunakan
informasi dari file client_secret.json yang Anda download setelah
membuat kredensial otorisasi. Objek tersebut juga mengidentifikasi
di mana aplikasi Anda meminta izin akses dan URL untuk
{i>auth endpoint<i}, yang akan menangani respons dari server OAuth 2.0 Google. Terakhir, kode
menetapkan parameter access_type
dan include_granted_scopes
opsional.
Misalnya, kode ini meminta akses hanya baca dan offline ke server Google Drive:
import google.oauth2.credentials import google_auth_oauthlib.flow # Required, call the from_client_secrets_file method to retrieve the client ID from a # client_secret.json file. The client ID (from that file) and access scopes are required. (You can # also use the from_client_config method, which passes the client configuration as it originally # appeared in a client secrets file but doesn't access the file itself.) flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.metadata.readonly']) # Required, indicate where the API server will redirect the user after the user completes # the authorization flow. The redirect URI is required. The value must exactly # match one of the authorized redirect URIs for the OAuth 2.0 client, which you # configured in the API Console. If this value doesn't match an authorized URI, # you will get a 'redirect_uri_mismatch' error. flow.redirect_uri = 'https://www.example.com/oauth2callback' # Generate URL for request to Google's OAuth 2.0 server. # Use kwargs to set optional request parameters. authorization_url, state = flow.authorization_url( # Recommended, enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Optional, enable incremental authorization. Recommended as a best practice. include_granted_scopes='true', # Optional, if your application knows which user is trying to authenticate, it can use this # parameter to provide a hint to the Google Authentication Server. login_hint='[email protected]', # Optional, set prompt to 'consent' will prompt the user for consent prompt='consent')
Ruby
Gunakan file client_secrets.json yang Anda buat untuk mengonfigurasi objek klien di aplikasi. Saat mengonfigurasi objek klien, Anda menentukan cakupan yang diperlukan aplikasi Anda akses, beserta URL ke endpoint autentikasi aplikasi Anda, yang akan menangani respons dari server OAuth 2.0.
Misalnya, kode ini meminta akses hanya baca dan offline ke server Google Drive:
require 'google/apis/drive_v3' require "googleauth" require 'googleauth/stores/redis_token_store' client_id = Google::Auth::ClientId.from_file('/path/to/client_secret.json') scope = 'https://www.googleapis.com/auth/drive.metadata.readonly' token_store = Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new) authorizer = Google::Auth::WebUserAuthorizer.new(client_id, scope, token_store, '/oauth2callback')
Aplikasi Anda menggunakan objek klien untuk melakukan operasi OAuth 2.0, seperti membuat URL permintaan otorisasi dan menerapkan token akses ke permintaan HTTP.
Node.js
Cuplikan kode berikut membuat objek google.auth.OAuth2
, yang menentukan
di dalam permintaan otorisasi.
Objek tersebut menggunakan informasi dari file client_secret.json untuk mengidentifikasi aplikasi Anda. Kepada meminta izin dari pengguna untuk mengambil token akses, Anda mengalihkan mereka ke halaman izin. Untuk membuat URL halaman izin:
const {google} = require('googleapis'); const crypto = require('crypto'); const express = require('express'); const session = require('express-session'); /** * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI * from the client_secret.json file. To get these credentials for your application, visit * https://console.cloud.google.com/apis/credentials. */ const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for read-only Drive activity. const scopes = [ 'https://www.googleapis.com/auth/drive.metadata.readonly' ]; // Generate a secure random state value. const state = crypto.randomBytes(32).toString('hex'); // Store state in the session req.session.state = state; // Generate a url that asks permissions for the Drive activity scope const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true, // Include the state parameter to reduce the risk of CSRF attacks. state: state });
Catatan Penting - refresh_token
hanya ditampilkan pada
otorisasi. Keterangan lebih rinci
di sini.
HTTP/REST
Endpoint OAuth 2.0 Google berada di https://accounts.google.com/o/oauth2/v2/auth
. Ini
endpoint hanya dapat diakses melalui HTTPS. Koneksi HTTP biasa ditolak.
Server otorisasi Google mendukung parameter string kueri berikut untuk web aplikasi server:
Parameter | |||||||
---|---|---|---|---|---|---|---|
client_id |
Wajib
Client ID untuk aplikasi Anda. Anda dapat menemukan nilai ini di kolom API Console Credentials page. |
||||||
redirect_uri |
Wajib
Menentukan tempat server API mengalihkan pengguna setelah pengguna menyelesaikan
alur otorisasi. Nilai harus sama persis dengan salah satu URI pengalihan yang diberi otorisasi untuk
klien OAuth 2.0 yang Anda konfigurasikan di
API Console
Credentials page. Jika nilai ini tidak sesuai dengan
URI pengalihan yang diberi otorisasi untuk Perhatikan bahwa skema |
||||||
response_type |
Wajib
Menentukan apakah endpoint Google OAuth 2.0 menampilkan kode otorisasi. Setel nilai parameter ke |
||||||
scope |
Wajib
J dipisahkan spasi daftar cakupan yang mengidentifikasi sumber daya yang dapat diakses aplikasi Anda di atas nama pengguna. Nilai ini memberi tahu layar izin yang ditampilkan Google kepada . Dengan cakupan, aplikasi Anda dapat hanya meminta akses ke resource yang diperlukan sekaligus memungkinkan pengguna mengontrol jumlah akses yang mereka berikan kepada Anda aplikasi. Jadi, ada hubungan terbalik antara jumlah cakupan yang diminta dan kemungkinan untuk mendapatkan izin pengguna. Sebaiknya aplikasi Anda meminta akses ke cakupan otorisasi sesuai konteks jika memungkinkan. Dengan meminta akses ke data pengguna sesuai konteks, melalui otorisasi inkremental, Anda membantu pengguna untuk memahami mengapa aplikasi Anda membutuhkan akses yang dimintanya. |
||||||
access_type |
Direkomendasikan
Menunjukkan apakah aplikasi Anda dapat memperbarui token akses saat pengguna tidak ada
pada browser. Nilai parameter yang valid adalah Setel nilai ke |
||||||
state |
Direkomendasikan
Menentukan nilai string yang digunakan aplikasi untuk mempertahankan status di antara
permintaan otorisasi dan
respons server otorisasi.
Server menampilkan nilai tepat yang Anda kirimkan sebagai pasangan Anda dapat menggunakan parameter ini untuk beberapa tujuan, seperti mengarahkan pengguna ke
resource yang benar dalam aplikasi Anda, mengirimkan nonce, dan memitigasi permintaan lintas situs
pemalsuan. Karena |
||||||
include_granted_scopes |
Opsional
Memungkinkan aplikasi menggunakan otorisasi tambahan untuk meminta akses ke
cakupan dalam konteks. Jika Anda menetapkan nilai parameter ini ke |
||||||
enable_granular_consent |
Opsional
Default-nya adalah Jika Google mengaktifkan izin terperinci untuk aplikasi, parameter ini tidak akan tidak lagi memiliki pengaruh apa pun. |
||||||
login_hint |
Opsional
Jika aplikasi Anda mengetahui pengguna mana yang mencoba mengautentikasi, parameter ini dapat digunakan untuk memberikan petunjuk ke Server Autentikasi Google. Server menggunakan petunjuk untuk menyederhanakan alur login baik dengan mengisi otomatis kolom email di formulir login atau dengan memilih sesi multi-login yang sesuai. Setel 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 informasi selengkapnya. Nilai yang dimungkinkan adalah:
|
Langkah 2: Alihkan ke server OAuth 2.0 Google
Arahkan pengguna ke server OAuth 2.0 Google untuk menginisiasi otentikasi dan proses otorisasi. Biasanya, ini terjadi ketika aplikasi Anda pertama kali perlu mengakses data pengguna. Dalam kasus otorisasi inkremental, juga terjadi ketika aplikasi Anda pertama kali perlu mengakses sumber daya tambahan yang belum memiliki izin untuk mengakses.
PHP
- Buat URL untuk meminta akses dari server OAuth 2.0 Google:
$auth_url = $client->createAuthUrl();
- Alihkan pengguna ke
$auth_url
:header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
Python
Contoh ini menunjukkan cara mengalihkan pengguna ke URL otorisasi menggunakan web Flask framework aplikasi:
return flask.redirect(authorization_url)
Ruby
- Buat URL untuk meminta akses dari server OAuth 2.0 Google:
auth_uri = authorizer.get_authorization_url(login_hint: user_id, request: request)
- Alihkan pengguna ke
auth_uri
.
Node.js
-
Gunakan URL yang dihasilkan
authorizationUrl
dari Langkah 1generateAuthUrl
untuk meminta akses dari server OAuth 2.0 Google. -
Alihkan pengguna ke
authorizationUrl
.res.redirect(authorizationUrl);
HTTP/REST
Sample redirect to Google's authorization server
An example URL is shown below, with line breaks and spaces for readability.
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly& access_type=offline& include_granted_scopes=true& response_type=code& state=state_parameter_passthrough_value& redirect_uri=https%3A//oauth2.example.com/code& client_id=client_id
Setelah Anda membuat URL permintaan, alihkan pengguna ke URL tersebut.
Server OAuth 2.0 Google mengautentikasi pengguna dan memperoleh persetujuan dari pengguna untuk aplikasi untuk mengakses cakupan yang diminta. Respons akan dikirim kembali ke aplikasi Anda menggunakan URL alihan yang telah Anda tentukan.
Langkah 3: Google meminta izin pengguna
Pada langkah ini, pengguna akan memutuskan apakah akan memberikan akses yang diminta ke aplikasi Anda. Di tahap ini, Google akan menampilkan jendela izin yang menampilkan nama aplikasi Anda dan Google API layanan yang meminta izin akses untuk mengakses dengan kredensial otorisasi pengguna dan ringkasan dari cakupan akses yang akan diberikan. Tujuan pengguna dapat menyetujui untuk memberikan akses ke satu atau beberapa cakupan yang diminta oleh aplikasi Anda atau menolak permintaan.
Aplikasi Anda tidak perlu melakukan apa pun pada tahap ini karena menunggu respons dari Server OAuth 2.0 Google yang menunjukkan apakah akses apa pun telah diberikan. Respons itu dijelaskan dalam melakukan langkah berikut.
Error
Permintaan ke endpoint otorisasi OAuth 2.0 Google mungkin menampilkan pesan error yang ditampilkan kepada pengguna alih-alih alur otentikasi dan otorisasi yang diharapkan. Kode error umum dan yang disarankan resolusi tercantum di bawah ini.
admin_policy_enforced
Akun Google tidak dapat memberikan otorisasi ke satu atau beberapa cakupan yang diminta karena kebijakan administrator Google Workspace mereka. Lihat artikel bantuan Admin Google Workspace Mengontrol data pihak ketiga & aplikasi internal mengakses data Google Workspace untuk informasi selengkapnya tentang bagaimana administrator dapat membatasi akses ke semua cakupan atau cakupan yang dibatasi hingga akses diberikan secara eksplisit ke ID klien OAuth Anda.
disallowed_useragent
Endpoint otorisasi ditampilkan di dalam agen pengguna tersemat yang tidak diizinkan oleh Kebijakan OAuth 2.0.
Android
Developer Android mungkin melihat pesan error ini saat membuka permintaan otorisasi di
android.webkit.WebView
Sebaiknya developer menggunakan library Android seperti
Login dengan Google untuk Android atau OpenID Foundation
AppAuth untuk Android.
Developer web mungkin mengalami error ini saat aplikasi Android membuka link web umum di agen pengguna yang disematkan dan pengguna membuka endpoint otorisasi OAuth 2.0 Google dari di situs Anda. Developer harus mengizinkan link umum agar terbuka di pengendali link default sistem operasi, yang mencakup Link Aplikasi Android atau aplikasi browser default. Tujuan Tab Khusus Android library juga merupakan opsi yang didukung.
iOS
Developer iOS dan macOS mungkin mengalami error ini saat membuka permintaan otorisasi di
WKWebView
Sebaiknya developer menggunakan library iOS seperti
Login dengan Google untuk iOS atau OpenID Foundation
AppAuth untuk iOS.
Developer web mungkin mengalami error ini saat aplikasi iOS atau macOS membuka link web umum di
agen pengguna yang disematkan dan pengguna membuka endpoint otorisasi OAuth 2.0 Google dari
di situs Anda. Developer harus mengizinkan link umum agar terbuka di pengendali link default
sistem operasi, yang mencakup
Link Universal
atau aplikasi browser default. Tujuan
SFSafariViewController
library juga merupakan opsi yang didukung.
org_internal
Client ID OAuth dalam permintaan adalah bagian dari project yang membatasi akses ke Akun Google di tindakan Organisasi Google Cloud. Untuk informasi selengkapnya tentang opsi konfigurasi ini, lihat Jenis pengguna di artikel bantuan Menyiapkan layar izin OAuth.
invalid_client
Rahasia klien OAuth salah. Ulas Klien OAuth , termasuk client ID dan rahasia yang digunakan untuk permintaan ini.
invalid_grant
Saat memuat ulang token akses atau menggunakan otorisasi inkremental, token mungkin sudah tidak berlaku atau telah dibatalkan. Autentikasi pengguna lagi dan minta izin pengguna untuk mendapatkan token baru. Jika Anda melanjutkan untuk melihat kesalahan ini, pastikan bahwa aplikasi Anda telah dikonfigurasi dengan benar dan bahwa Anda menggunakan token dan parameter yang benar dalam permintaan Anda. Jika tidak, akun pengguna mungkin memiliki telah dihapus atau dinonaktifkan.
redirect_uri_mismatch
redirect_uri
yang diteruskan dalam permintaan otorisasi tidak cocok dengan
URI pengalihan untuk client ID OAuth. Tinjau URI pengalihan yang diberi otorisasi di
Google API Console Credentials page
Parameter redirect_uri
dapat merujuk pada alur out-of-band (OOB) OAuth yang memiliki
tidak digunakan lagi dan tidak didukung lagi. Lihat
panduan migrasi untuk memperbarui
integrasi.
invalid_request
Ada yang salah dengan permintaan yang Anda buat. Ini bisa disebabkan oleh beberapa alasan:
- Permintaan tidak diformat dengan benar
- Permintaan tidak berisi parameter yang diperlukan
- Permintaan tersebut menggunakan metode otorisasi yang tidak didukung oleh Google. Verifikasi OAuth Anda menggunakan metode integrasi yang direkomendasikan
Langkah 4: Tangani respons server OAuth 2.0
Server OAuth 2.0 merespons permintaan akses aplikasi Anda menggunakan URL yang ditentukan dalam permintaan.
Jika pengguna menyetujui permintaan akses, respons akan berisi kode otorisasi. Jika pengguna tidak menyetujui permintaan, respons akan berisi pesan error. Tujuan kode otorisasi atau pesan error yang dikembalikan ke server web akan muncul pada kueri string, seperti yang ditunjukkan di bawah ini:
Respons error:
https://oauth2.example.com/auth?error=access_denied
Respons kode otorisasi:
https://oauth2.example.com/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7
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:
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly& access_type=offline& include_granted_scopes=true& response_type=code& state=state_parameter_passthrough_value& redirect_uri=https%3A//oauth2.example.com/code& client_id=client_id
Setelah menyelesaikan alur OAuth 2.0, Anda akan dialihkan ke
http://localhost/oauth2callback
, yang mungkin akan menghasilkan
Error 404 NOT FOUND
kecuali komputer lokal Anda menayangkan file di alamat tersebut. Tujuan
langkah berikutnya memberikan detail selengkapnya tentang informasi yang ditampilkan dalam URI saat pengguna
dialihkan kembali ke aplikasi Anda.
Langkah 5: Tukarkan kode otorisasi untuk pembaruan dan akses token
Setelah menerima kode otorisasi, server web dapat menukar kode otorisasi untuk token akses.
PHP
Untuk menukar kode otorisasi dengan token akses, gunakan authenticate
berikut:
$client->authenticate($_GET['code']);
Anda dapat mengambil token akses dengan metode getAccessToken
:
$access_token = $client->getAccessToken();
Python
Di halaman callback, gunakan library google-auth
untuk memverifikasi otorisasi
respons server tertentu. Kemudian, gunakan metode flow.fetch_token
untuk menukar otorisasi
kode dalam respons itu untuk token akses:
state = flask.session['state'] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'], state=state) flow.redirect_uri = flask.url_for('oauth2callback', _external=True) authorization_response = flask.request.url flow.fetch_token(authorization_response=authorization_response) # Store the credentials in the session. # ACTION ITEM for developers: # Store user's access and refresh tokens in your data store if # incorporating this code into your real app. credentials = flow.credentials flask.session['credentials'] = { 'token': credentials.token, 'refresh_token': credentials.refresh_token, 'token_uri': credentials.token_uri, 'client_id': credentials.client_id, 'client_secret': credentials.client_secret, 'scopes': credentials.scopes}
Ruby
Di halaman callback, gunakan library googleauth
untuk memverifikasi server otorisasi
yang dihasilkan. Gunakan metode authorizer.handle_auth_callback_deferred
untuk menyimpan
kode otorisasi dan mengalihkan kembali ke URL
yang awalnya meminta otorisasi. Ini
menunda pertukaran kode dengan menyimpan sementara hasil di sesi pengguna.
target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request) redirect target_url
Node.js
Untuk menukar kode otorisasi dengan token akses, gunakan getToken
berikut:
const url = require('url'); // Receive the callback from Google's OAuth 2.0 server. app.get('/oauth2callback', async (req, res) => { let q = url.parse(req.url, true).query; if (q.error) { // An error response e.g. error=access_denied console.log('Error:' + q.error); } else if (q.state !== req.session.state) { //check state value console.log('State mismatch. Possible CSRF attack'); res.end('State mismatch. Possible CSRF attack'); } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); });
HTTP/REST
Untuk menukar kode otorisasi dengan token akses, panggil metode
Endpoint https://oauth2.googleapis.com/token
, lalu tetapkan parameter berikut:
Kolom | |
---|---|
client_id |
Client ID yang diperoleh dari API Console Credentials page. |
client_secret |
Rahasia klien yang diperoleh dari API Console Credentials page. |
code |
Kode otorisasi yang ditampilkan dari permintaan awal. |
grant_type |
Seperti yang dijelaskan dalam OAuth 2.0
spesifikasi, nilai kolom ini harus ditetapkan ke authorization_code . |
redirect_uri |
Salah satu URI pengalihan yang tercantum untuk project Anda di
API Console
Credentials page untuk yang diberikan
client_id . |
Cuplikan berikut menunjukkan contoh permintaan:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& client_id=your_client_id& client_secret=your_client_secret& redirect_uri=https%3A//oauth2.example.com/code& grant_type=authorization_code
Google merespons permintaan ini dengan menampilkan objek JSON yang berisi akses jangka pendek
dan token refresh.
Perhatikan bahwa token refresh hanya ditampilkan jika aplikasi Anda menetapkan access_type
ke offline
dalam permintaan awal ke permintaan
server otorisasi.
Respons berisi kolom berikut:
Kolom | |
---|---|
access_token |
Token yang dikirimkan aplikasi Anda untuk mengizinkan permintaan Google API. |
expires_in |
Sisa masa pakai token akses dalam hitungan detik. |
refresh_token |
Token yang dapat digunakan untuk mendapatkan token akses baru. Token refresh berlaku hingga
pengguna mencabut akses.
Sekali lagi, kolom ini hanya ada dalam respons ini jika Anda menyetel access_type
ke offline dalam permintaan awal ke server otorisasi Google.
|
scope |
Cakupan akses yang diberikan oleh access_token yang dinyatakan sebagai daftar
{i>string<i} yang peka huruf besar/kecil dan dipisahkan spasi. |
token_type |
Jenis token yang ditampilkan. Saat ini, nilai bidang ini selalu disetel ke
Bearer . |
Cuplikan berikut menunjukkan contoh respons:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Error
Saat menukar kode otorisasi untuk token akses, Anda mungkin menemukan hal berikut error, bukannya respons yang diharapkan. Kode error umum dan penyelesaian yang disarankan adalah yang tercantum di bawah ini.
invalid_grant
Kode otorisasi yang diberikan tidak valid atau formatnya salah. Minta kode baru paling lambat memulai ulang proses OAuth untuk meminta izin pengguna untuk mencoba lagi perintah.
Memanggil Google API
PHP
Gunakan token akses untuk memanggil Google API dengan menyelesaikan langkah-langkah berikut:
- Jika Anda perlu menerapkan token akses ke objek
Google\Client
baru — untuk Misalnya, jika Anda menyimpan token akses dalam sesi pengguna — gunakan MetodesetAccessToken
:$client->setAccessToken($access_token);
- Bangun objek layanan untuk API yang ingin Anda panggil. Anda membangun objek layanan dengan
memberikan objek
Google\Client
yang diotorisasi ke konstruktor untuk API yang Anda telepon Anda. Misalnya, untuk memanggil Drive API:$drive = new Google\Service\Drive($client);
- Buat permintaan ke layanan API menggunakan
antarmuka yang disediakan oleh objek layanan.
Misalnya, untuk membuat daftar file di Google Drive pengguna yang diautentikasi:
$files = $drive->files->listFiles(array())->getItems();
Python
Setelah mendapatkan token akses, aplikasi Anda dapat menggunakan token tersebut untuk mengotorisasi permintaan API pada nama akun pengguna atau akun layanan tertentu. Menggunakan kredensial otorisasi khusus pengguna untuk membangun objek layanan untuk API yang ingin Anda panggil, lalu menggunakan objek itu untuk permintaan API yang diizinkan.
- Bangun objek layanan untuk API yang ingin Anda panggil. Anda membangun objek layanan dengan
memanggil metode
build
librarygoogleapiclient.discovery
dengan nama dan versi API serta kredensial pengguna: Misalnya, untuk memanggil Drive API versi 3:from googleapiclient.discovery import build drive = build('drive', 'v2', credentials=credentials)
- Buat permintaan ke layanan API menggunakan
antarmuka yang disediakan oleh objek layanan.
Misalnya, untuk membuat daftar file di Google Drive pengguna yang diautentikasi:
files = drive.files().list().execute()
Ruby
Setelah mendapatkan token akses, aplikasi Anda dapat menggunakan token tersebut untuk membuat permintaan API di nama akun pengguna atau akun layanan tertentu. Menggunakan kredensial otorisasi khusus pengguna untuk membangun objek layanan untuk API yang ingin Anda panggil, lalu menggunakan objek itu untuk permintaan API yang diizinkan.
- Bangun objek layanan untuk API yang ingin Anda panggil.
Misalnya, untuk memanggil Drive API versi 3:
drive = Google::Apis::DriveV3::DriveService.new
- Tetapkan kredensial pada layanan:
drive.authorization = credentials
- Buat permintaan ke layanan API menggunakan
antarmuka
yang disediakan oleh objek layanan.
Misalnya, untuk membuat daftar file di Google Drive pengguna yang diautentikasi:
files = drive.list_files
Atau, otorisasi dapat diberikan per metode dengan menyediakan
Parameter options
ke metode:
files = drive.list_files(options: { authorization: credentials })
Node.js
Setelah mendapatkan token akses dan menyetelnya ke objek OAuth2
, gunakan objek tersebut
untuk memanggil Google API. Aplikasi Anda dapat menggunakan token tersebut untuk mengizinkan permintaan API atas nama
akun pengguna atau akun layanan tertentu. Bangun objek layanan untuk API yang ingin Anda panggil.
const { google } = require('googleapis'); // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { if (err1) return console.log('The API returned an error: ' + err1); const files = res1.data.files; if (files.length) { console.log('Files:'); files.map((file) => { console.log(`${file.name} (${file.id})`); }); } else { console.log('No files found.'); } });
HTTP/REST
Setelah aplikasi Anda mendapatkan token akses, Anda bisa menggunakan token tersebut untuk melakukan panggilan ke
API atas nama objek
jika cakupan akses yang diperlukan oleh API telah diberikan. Untuk melakukannya, sertakan
token akses dalam permintaan ke API dengan menyertakan kueri access_token
atau nilai Bearer
header HTTP Authorization
. Jika memungkinkan,
header HTTP lebih disukai, karena string kueri cenderung terlihat di log server. Dalam sebagian besar
Anda dapat menggunakan library klien untuk menyiapkan panggilan ke Google API (misalnya, saat
memanggil Drive Files API).
Anda dapat mencoba semua Google API dan melihat cakupannya di OAuth 2.0 Playground.
Contoh GET HTTP
Panggilan ke
drive.files
endpoint (Drive Files API) menggunakan HTTP Authorization: Bearer
{i>header<i} akan terlihat seperti berikut. Perhatikan bahwa Anda perlu menentukan token akses Anda sendiri:
GET /drive/v2/files HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
Berikut adalah panggilan ke API yang sama untuk pengguna terautentikasi menggunakan access_token
parameter string kueri:
GET https://www.googleapis.com/drive/v2/files?access_token=access_token
Contoh curl
Anda dapat menguji perintah ini dengan aplikasi command line curl
. Berikut adalah
contoh yang menggunakan opsi header HTTP (lebih disukai):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files
Atau, sebagai alternatif, opsi parameter string kueri:
curl https://www.googleapis.com/drive/v2/files?access_token=access_token
Contoh lengkap
Contoh berikut mencetak daftar file berformat JSON di Google Drive pengguna setelah pengguna mengautentikasi dan memberikan izin agar aplikasi dapat mengakses metadata Drive pengguna.
PHP
Untuk menjalankan contoh ini:
- Di API Console, tambahkan URL komputer lokal ke bagian
daftar URL pengalihan. Misalnya, tambahkan
http://localhost:8080
. - Buat direktori baru dan ubah ke direktori tersebut. Contoh:
mkdir ~/php-oauth2-example cd ~/php-oauth2-example
- Instal Klien Google API
Library untuk PHP menggunakan Composer:
composer require google/apiclient:^2.10
- Membuat file
index.php
danoauth2callback.php
dengan konten di bawah ini. - Jalankan contoh dengan server web yang dikonfigurasi untuk menyalurkan PHP. Jika Anda menggunakan PHP 5.6 atau yang lebih baru, Anda
dapat menggunakan server web pengujian bawaan PHP:
php -S localhost:8080 ~/php-oauth2-example
index.php
<?php require_once __DIR__.'/vendor/autoload.php'; session_start(); $client = new Google\Client(); $client->setAuthConfig('client_secrets.json'); $client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY); if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { $client->setAccessToken($_SESSION['access_token']); $drive = new Google\Service\Drive($client); $files = $drive->files->listFiles(array())->getItems(); echo json_encode($files); } else { $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'; header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); }
oauth2callback.php
<?php require_once __DIR__.'/vendor/autoload.php'; session_start(); $client = new Google\Client(); $client->setAuthConfigFile('client_secrets.json'); $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'); $client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY); if (! isset($_GET['code'])) { // Generate and set state value $state = bin2hex(random_bytes(16)); $client->setState($state); $_SESSION['state'] = $state; $auth_url = $client->createAuthUrl(); header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL)); } else { // Check the state value if (!isset($_GET['state']) || $_GET['state'] !== $_SESSION['state']) { die('State mismatch. Possible CSRF attack.'); } $client->authenticate($_GET['code']); $_SESSION['access_token'] = $client->getAccessToken(); $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/'; header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); }
Python
Contoh ini menggunakan framework Flask. Ini
menjalankan aplikasi web di http://localhost:8080
yang memungkinkan Anda menguji OAuth 2.0
alur kerja. Jika membuka URL tersebut, Anda akan melihat empat link:
- Menguji permintaan API: Link ini mengarah ke halaman yang mencoba menjalankan API contoh permintaan. Jika perlu, alur otorisasi akan dimulai. Jika berhasil, halaman akan menampilkan Respons API.
- Menguji alur autentikasi secara langsung: Link ini mengarah ke halaman yang mencoba mengarahkan pengguna melalui alur otorisasi. Aplikasi meminta izin untuk mengirim permintaan API yang diotorisasi atas nama pengguna.
- Cabut kredensial saat ini: Link ini mengarah ke halaman yang mencabut izin yang telah diberikan pengguna ke aplikasi.
- Clear Flask sesi credentials: Link ini menghapus kredensial otorisasi yang yang disimpan di sesi Flask. Hal ini memungkinkan Anda melihat apa yang akan terjadi jika pengguna yang sudah memberi aplikasi Anda izin untuk mencoba mengeksekusi permintaan API dalam sesi baru. Ini juga memungkinkan Anda melihat respons API yang akan didapatkan aplikasi Anda jika pengguna telah mencabut izin yang diberikan tetapi aplikasi Anda masih mencoba untuk mengizinkan permintaan dengan token akses yang dicabut.
# -*- coding: utf-8 -*- import os import flask import requests import google.oauth2.credentials import google_auth_oauthlib.flow import googleapiclient.discovery # This variable specifies the name of a file that contains the OAuth 2.0 # information for this application, including its client_id and client_secret. CLIENT_SECRETS_FILE = "client_secret.json" # This OAuth 2.0 access scope allows for full read/write access to the # authenticated user's account and requires requests to use an SSL connection. SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'] API_SERVICE_NAME = 'drive' API_VERSION = 'v2' app = flask.Flask(__name__) # Note: A secret key is included in the sample so that it works. # If you use this code in your application, replace this with a truly secret # key. See https://flask.palletsprojects.com/quickstart/#sessions. app.secret_key = 'REPLACE ME - this value is here as a placeholder.' @app.route('/') def index(): return print_index_table() @app.route('/test') def test_api_request(): if 'credentials' not in flask.session: return flask.redirect('authorize') # Load credentials from the session. credentials = google.oauth2.credentials.Credentials( **flask.session['credentials']) drive = googleapiclient.discovery.build( API_SERVICE_NAME, API_VERSION, credentials=credentials) files = drive.files().list().execute() # Save credentials back to session in case access token was refreshed. # ACTION ITEM: In a production app, you likely want to save these # credentials in a persistent database instead. flask.session['credentials'] = credentials_to_dict(credentials) return flask.jsonify(**files) @app.route('/authorize') def authorize(): # Create flow instance to manage the OAuth 2.0 Authorization Grant Flow steps. flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( CLIENT_SECRETS_FILE, scopes=SCOPES) # The URI created here must exactly match one of the authorized redirect URIs # for the OAuth 2.0 client, which you configured in the API Console. If this # value doesn't match an authorized URI, you will get a 'redirect_uri_mismatch' # error. flow.redirect_uri = flask.url_for('oauth2callback', _external=True) authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true') # Store the state so the callback can verify the auth server response. flask.session['state'] = state return flask.redirect(authorization_url) @app.route('/oauth2callback') def oauth2callback(): # Specify the state when creating the flow in the callback so that it can # verified in the authorization server response. state = flask.session['state'] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( CLIENT_SECRETS_FILE, scopes=SCOPES, state=state) flow.redirect_uri = flask.url_for('oauth2callback', _external=True) # Use the authorization server's response to fetch the OAuth 2.0 tokens. authorization_response = flask.request.url flow.fetch_token(authorization_response=authorization_response) # Store credentials in the session. # ACTION ITEM: In a production app, you likely want to save these # credentials in a persistent database instead. credentials = flow.credentials flask.session['credentials'] = credentials_to_dict(credentials) return flask.redirect(flask.url_for('test_api_request')) @app.route('/revoke') def revoke(): if 'credentials' not in flask.session: return ('You need to <a href="/https/developers.google.com/authorize">authorize</a> before ' + 'testing the code to revoke credentials.') credentials = google.oauth2.credentials.Credentials( **flask.session['credentials']) revoke = requests.post('https://oauth2.googleapis.com/revoke', params={'token': credentials.token}, headers = {'content-type': 'application/x-www-form-urlencoded'}) status_code = getattr(revoke, 'status_code') if status_code == 200: return('Credentials successfully revoked.' + print_index_table()) else: return('An error occurred.' + print_index_table()) @app.route('/clear') def clear_credentials(): if 'credentials' in flask.session: del flask.session['credentials'] return ('Credentials have been cleared.<br><br>' + print_index_table()) def credentials_to_dict(credentials): return {'token': credentials.token, 'refresh_token': credentials.refresh_token, 'token_uri': credentials.token_uri, 'client_id': credentials.client_id, 'client_secret': credentials.client_secret, 'scopes': credentials.scopes} def print_index_table(): return ('<table>' + '<tr><td><a href="/https/developers.google.com/test">Test an API request</a></td>' + '<td>Submit an API request and see a formatted JSON response. ' + ' Go through the authorization flow if there are no stored ' + ' credentials for the user.</td></tr>' + '<tr><td><a href="/https/developers.google.com/authorize">Test the auth flow directly</a></td>' + '<td>Go directly to the authorization flow. If there are stored ' + ' credentials, you still might not be prompted to reauthorize ' + ' the application.</td></tr>' + '<tr><td><a href="/https/developers.google.com/revoke">Revoke current credentials</a></td>' + '<td>Revoke the access token associated with the current user ' + ' session. After revoking credentials, if you go to the test ' + ' page, you should see an <code>invalid_grant</code> error.' + '</td></tr>' + '<tr><td><a href="/https/developers.google.com/clear">Clear Flask session credentials</a></td>' + '<td>Clear the access token currently stored in the user session. ' + ' After clearing the token, if you <a href="/https/developers.google.com/test">test the ' + ' API request</a> again, you should go back to the auth flow.' + '</td></tr></table>') if __name__ == '__main__': # When running locally, disable OAuthlib's HTTPs verification. # ACTION ITEM for developers: # When running in production *do not* leave this option enabled. os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' # Specify a hostname and port that are set as a valid redirect URI # for your API project in the Google API Console. app.run('localhost', 8080, debug=True)
Ruby
Contoh ini menggunakan framework Sinatra.
require 'google/apis/drive_v3' require 'sinatra' require 'googleauth' require 'googleauth/stores/redis_token_store' configure do enable :sessions set :client_id, Google::Auth::ClientId.from_file('/path/to/client_secret.json') set :scope, Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY set :token_store, Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new) set :authorizer, Google::Auth::WebUserAuthorizer.new(settings.client_id, settings.scope, settings.token_store, '/oauth2callback') end get '/' do user_id = settings.client_id.id credentials = settings.authorizer.get_credentials(user_id, request) if credentials.nil? redirect settings.authorizer.get_authorization_url(login_hint: user_id, request: request) end drive = Google::Apis::DriveV3::DriveService.new files = drive.list_files(options: { authorization: credentials }) "<pre>#{JSON.pretty_generate(files.to_h)}</pre>" end get '/oauth2callback' do target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request) redirect target_url end
Node.js
Untuk menjalankan contoh ini:
-
Di API Console, tambahkan URL elemen
komputer lokal ke daftar
URL pengalihan. Misalnya, tambahkan
http://localhost
. - Pastikan Anda memiliki LTS pemeliharaan, LTS aktif, atau rilis aplikasi Node.js terinstal.
-
Buat direktori baru dan ubah ke direktori tersebut. Contoh:
mkdir ~/nodejs-oauth2-example cd ~/nodejs-oauth2-example
-
Install the
Google API Client
Library
for Node.js using npm:
npm install googleapis
-
Buat file
main.js
dengan konten di bawah ini. -
Jalankan contoh:
node .\main.js
main.js
const http = require('http'); const https = require('https'); const url = require('url'); const { google } = require('googleapis'); const crypto = require('crypto'); const express = require('express'); const session = require('express-session'); /** * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI. * To get these credentials for your application, visit * https://console.cloud.google.com/apis/credentials. */ const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for read-only Drive activity. const scopes = [ 'https://www.googleapis.com/auth/drive.metadata.readonly' ]; /* Global variable that stores user credential in this code example. * ACTION ITEM for developers: * Store user's refresh token in your data store if * incorporating this code into your real app. * For more information on handling refresh tokens, * see https://github.com/googleapis/google-api-nodejs-client#handling-refresh-tokens */ let userCredential = null; async function main() { const app = express(); app.use(session({ secret: 'your_secure_secret_key', // Replace with a strong secret resave: false, saveUninitialized: false, })); // Example on redirecting user to Google's OAuth 2.0 server. app.get('/', async (req, res) => { // Generate a secure random state value. const state = crypto.randomBytes(32).toString('hex'); // Store state in the session req.session.state = state; // Generate a url that asks permissions for the Drive activity scope const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true, // Include the state parameter to reduce the risk of CSRF attacks. state: state }); res.redirect(authorizationUrl); }); // Receive the callback from Google's OAuth 2.0 server. app.get('/oauth2callback', async (req, res) => { // Handle the OAuth 2.0 server response let q = url.parse(req.url, true).query; if (q.error) { // An error response e.g. error=access_denied console.log('Error:' + q.error); } else if (q.state !== req.session.state) { //check state value console.log('State mismatch. Possible CSRF attack'); res.end('State mismatch. Possible CSRF attack'); } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); /** Save credential to the global variable in case access token was refreshed. * ACTION ITEM: In a production app, you likely want to save the refresh token * in a secure persistent database instead. */ userCredential = tokens; // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { if (err1) return console.log('The API returned an error: ' + err1); const files = res1.data.files; if (files.length) { console.log('Files:'); files.map((file) => { console.log(`${file.name} (${file.id})`); }); } else { console.log('No files found.'); } }); } }); // Example on revoking a token app.get('/revoke', async (req, res) => { // Build the string for the POST request let postData = "token=" + userCredential.access_token; // Options for POST request to Google's OAuth 2.0 server to revoke a token let postOptions = { host: 'oauth2.googleapis.com', port: '443', path: '/revoke', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(postData) } }; // Set up the request const postReq = https.request(postOptions, function (res) { res.setEncoding('utf8'); res.on('data', d => { console.log('Response: ' + d); }); }); postReq.on('error', error => { console.log(error) }); // Post the request with data postReq.write(postData); postReq.end(); }); const server = http.createServer(app); server.listen(80); } main().catch(console.error);
HTTP/REST
Contoh Python ini menggunakan framework Flask dan library Permintaan untuk mendemonstrasikan 2.0. Sebaiknya gunakan Library Klien Google API untuk Python untuk alur ini. ( di tab Python menggunakan library klien.)
import json import flask import requests app = flask.Flask(__name__) CLIENT_ID = '123456789.apps.googleusercontent.com' CLIENT_SECRET = 'abc123' # Read from a file or environmental variable in a real app SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly' REDIRECT_URI = 'http://example.com/oauth2callback' @app.route('/') def index(): if 'credentials' not in flask.session: return flask.redirect(flask.url_for('oauth2callback')) credentials = json.loads(flask.session['credentials']) if credentials['expires_in'] <= 0: return flask.redirect(flask.url_for('oauth2callback')) else: headers = {'Authorization': 'Bearer {}'.format(credentials['access_token'])} req_uri = 'https://www.googleapis.com/drive/v2/files' r = requests.get(req_uri, headers=headers) return r.text @app.route('/oauth2callback') def oauth2callback(): if 'code' not in flask.request.args: state = str(uuid.uuid4()) flask.session['state'] = state auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code' '&client_id={}&redirect_uri={}&scope={}&state={}').format(CLIENT_ID, REDIRECT_URI, SCOPE, state) return flask.redirect(auth_uri) else: if 'state' not in flask.request.args or flask.request.args['state'] != flask.session['state']: return 'State mismatch. Possible CSRF attack.', 400 auth_code = flask.request.args.get('code') data = {'code': auth_code, 'client_id': CLIENT_ID, 'client_secret': CLIENT_SECRET, 'redirect_uri': REDIRECT_URI, 'grant_type': 'authorization_code'} r = requests.post('https://oauth2.googleapis.com/token', data=data) flask.session['credentials'] = r.text return flask.redirect(flask.url_for('index')) if __name__ == '__main__': import uuid app.secret_key = str(uuid.uuid4()) app.debug = False app.run()
Aturan validasi URI pengalihan
Google menerapkan aturan validasi berikut untuk mengalihkan URI guna membantu developer menjaga keamanan aplikasi mereka. URI pengalihan Anda harus mematuhi aturan ini. Lihat RFC 3986 bagian 3 untuk definisi domain, host, jalur, kueri, skema, dan info pengguna, yang disebutkan di bawah ini.
Aturan validasi | |
---|---|
Skema |
URI pengalihan harus menggunakan skema HTTPS, bukan HTTP biasa. URI Localhost (termasuk URI alamat IP localhost) dikecualikan dari aturan ini. |
Penyelenggara |
Host tidak boleh berupa alamat IP mentah. Alamat IP Localhost dikecualikan dari aturan ini. |
Domain |
“googleusercontent.com” .goo.gl ) kecuali
apakah aplikasi memiliki domain. Selain itu, jika aplikasi yang memiliki domain pemendekan memilih untuk
mengalihkan ke domain tersebut, URI pengalihan tersebut harus berisi
“/google-callback/” di jalurnya atau diakhiri dengan
“/google-callback” . |
Info pengguna |
URI pengalihan tidak boleh berisi subkomponen userinfo. |
Jalur |
URI pengalihan tidak boleh berisi path traversal (juga disebut backtracking direktori),
yang diwakili oleh |
Kueri |
URI pengalihan tidak boleh berisi pengalihan terbuka. |
Fragment |
URI pengalihan tidak boleh berisi komponen fragmen. |
Karakter |
URI pengalihan tidak boleh berisi karakter tertentu, termasuk:
|
Otorisasi inkremental
Pada protokol OAuth 2.0, aplikasi Anda meminta otorisasi untuk mengakses sumber daya, yang diidentifikasi berdasarkan cakupan. Permintaan otorisasi dianggap sebagai praktik pengalaman pengguna terbaik 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 mungkin ditukar dengan token yang berisi semua cakupan yang telah diberikan pengguna ke project.
Misalnya, aplikasi yang memungkinkan pengguna mengambil sampel trek musik dan membuat mix mungkin memerlukan sangat sedikit sumber daya pada saat masuk, mungkin tidak lebih dari nama orang yang masuk. Namun, menyimpan campuran yang telah selesai akan memerlukan akses ke Google Drive mereka. Kebanyakan orang akan menemukannya wajar jika mereka hanya diminta untuk mengakses Google Drive mereka pada saat aplikasi benar-benar membutuhkannya.
Dalam hal ini, saat login, aplikasi mungkin meminta openid
dan
profile
untuk melakukan login dasar, lalu meminta metode
https://www.googleapis.com/auth/drive.file
cakupan pada saat permintaan pertama untuk menyimpan
campuran.
Untuk mengimplementasikan otorisasi tambahan, Anda harus menyelesaikan alur normal untuk meminta akses tetapi pastikan bahwa permintaan otorisasi sudah mencakup cakupan yang diberikan sebelumnya. Ini memungkinkan aplikasi Anda untuk menghindari perlunya mengelola banyak token akses.
Aturan berikut berlaku untuk token akses yang diperoleh dari otorisasi inkremental:
- Token dapat digunakan untuk mengakses resource yang terkait dengan cakupan apa pun yang digabungkan ke dalam otorisasi baru yang digabungkan.
- Saat Anda menggunakan token refresh untuk otorisasi gabungan guna memperoleh token akses,
token akses mewakili otorisasi gabungan dan dapat digunakan untuk
scope
nilai disertakan dalam respons. - Otorisasi gabungan mencakup semua cakupan yang diberikan pengguna ke proyek API bahkan jika hibah diminta dari klien yang berbeda. Misalnya, jika pengguna memberikan akses ke satu ruang lingkup menggunakan klien desktop aplikasi dan kemudian memberikan ruang lingkup lain ke aplikasi melalui klien seluler, otorisasi gabungan akan mencakup kedua cakupan.
- Jika Anda mencabut token yang mewakili otorisasi gabungan, akses ke semua cakupan otorisasi atas nama pengguna terkait dicabut secara bersamaan.
Contoh kode khusus bahasa di Langkah 1: Tetapkan otorisasi parameter dan contoh URL alihan HTTP/REST di Langkah 2: Alihkan ke server OAuth 2.0 Google semuanya menggunakan otorisasi tambahan. Contoh kode di bawah ini juga menunjukkan kode yang perlu Anda tambahkan untuk menggunakan otorisasi tambahan.
PHP
$client->setIncludeGrantedScopes(true);
Python
Di Python, tetapkan argumen kata kunci include_granted_scopes
ke true
ke
memastikan bahwa permintaan otorisasi menyertakan cakupan yang telah diberikan sebelumnya. Sangat mungkin bahwa
include_granted_scopes
tidak akan menjadi satu-satunya argumen kata kunci yang Anda tetapkan, seperti
yang ditunjukkan dalam contoh di bawah ini.
authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true')
Ruby
auth_client.update!( :additional_parameters => {"include_granted_scopes" => "true"} )
Node.js
const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true });
HTTP/REST
GET https://accounts.google.com/o/oauth2/v2/auth? client_id=your_client_id& response_type=code& state=state_parameter_passthrough_value& scope=https%3A//www.googleapis.com/auth/drive.file& redirect_uri=https%3A//oauth2.example.com/code& prompt=consent& include_granted_scopes=true
Memperbarui token akses (akses offline)
Masa berlaku token akses habis secara berkala dan menjadi kredensial yang tidak valid untuk permintaan API terkait. Anda dapat memperbarui token akses tanpa meminta izin kepada pengguna (termasuk saat pengguna tidak ada) jika Anda meminta akses offline ke cakupan yang terkait dengan token.
- Jika Anda menggunakan Library Klien Google API, objek klien akan dimuat ulang token akses sesuai kebutuhan selama Anda mengonfigurasi objek itu untuk akses {i>offline<i}.
- Jika tidak menggunakan library klien, Anda perlu menyetel HTTP
access_type
parameter kueri keoffline
ketika mengalihkan pengguna ke Server OAuth 2.0 Google. Dalam hal ini, server otorisasi Google akan mengembalikan memperbarui token ketika Anda menukarkan otorisasi untuk token akses. Kemudian, jika masa berlaku token akses berakhir (atau kapan saja), Anda dapat menggunakan token refresh untuk mendapatkan token akses baru.
Meminta akses offline merupakan persyaratan bagi aplikasi apa pun yang perlu mengakses
API saat pengguna tidak ada. Misalnya, aplikasi yang melakukan
layanan pencadangan atau
mengeksekusi tindakan pada waktu yang telah ditentukan agar dapat
memperbarui token akses ketika
pengguna tidak ada. Gaya default akses disebut online
.
Aplikasi web sisi server, aplikasi terinstal, dan perangkat, semuanya mendapatkan token refresh selama proses otorisasi. Token refresh tidak biasanya digunakan di sisi klien (JavaScript).
PHP
Jika aplikasi Anda memerlukan akses offline ke Google API, setel jenis akses klien API ke
offline
:
$client->setAccessType("offline");
Setelah pengguna memberikan akses offline ke cakupan yang diminta, Anda dapat terus menggunakan API klien untuk mengakses Google API atas nama pengguna saat pengguna sedang offline. Objek klien akan memperbarui token akses sesuai kebutuhan.
Python
Di Python, tetapkan argumen kata kunci access_type
ke offline
untuk memastikan
Anda akan dapat menyegarkan token akses
tanpa harus meminta ulang pengguna untuk
izin akses. Sangat mungkin bahwa access_type
tidak akan menjadi satu-satunya kata kunci
yang Anda tetapkan, seperti yang ditampilkan dalam contoh di bawah ini.
authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true')
Setelah pengguna memberikan akses offline ke cakupan yang diminta, Anda dapat terus menggunakan API klien untuk mengakses Google API atas nama pengguna saat pengguna sedang offline. Objek klien akan memperbarui token akses sesuai kebutuhan.
Ruby
Jika aplikasi Anda memerlukan akses offline ke Google API, setel jenis akses klien API ke
offline
:
auth_client.update!( :additional_parameters => {"access_type" => "offline"} )
Setelah pengguna memberikan akses offline ke cakupan yang diminta, Anda dapat terus menggunakan API klien untuk mengakses Google API atas nama pengguna saat pengguna sedang offline. Objek klien akan memperbarui token akses sesuai kebutuhan.
Node.js
Jika aplikasi Anda memerlukan akses offline ke Google API, setel jenis akses klien API ke
offline
:
const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true });
Setelah pengguna memberikan akses offline ke cakupan yang diminta, Anda dapat terus menggunakan API klien untuk mengakses Google API atas nama pengguna saat pengguna sedang offline. Objek klien akan memperbarui token akses sesuai kebutuhan.
Masa berlaku token akses berakhir. Library ini akan otomatis menggunakan token refresh untuk mendapatkan akses baru token jika masa berlakunya akan habis. Cara mudah untuk memastikan Anda selalu menyimpan token terbaru adalah dengan menggunakan peristiwa token:
oauth2Client.on('tokens', (tokens) => { if (tokens.refresh_token) { // store the refresh_token in your secure persistent database console.log(tokens.refresh_token); } console.log(tokens.access_token); });
Peristiwa token ini hanya terjadi pada otorisasi pertama, dan Anda harus menetapkan
access_type
ke offline
saat memanggil generateAuthUrl
untuk menerima token refresh. Jika Anda telah memberikan izin yang diperlukan kepada aplikasi
tanpa menetapkan batasan yang sesuai untuk menerima token refresh, Anda harus
memberikan otorisasi ulang kepada aplikasi untuk menerima token refresh baru.
Untuk menetapkan refresh_token
di lain waktu, Anda dapat menggunakan metode setCredentials
:
oauth2Client.setCredentials({ refresh_token: `STORED_REFRESH_TOKEN` });
Setelah klien memiliki token refresh, token akses akan diperoleh dan dimuat ulang secara otomatis dalam panggilan berikutnya ke API.
HTTP/REST
Untuk memuat ulang token akses, aplikasi Anda mengirim POST
HTTPS
permintaan ke server otorisasi Google (https://oauth2.googleapis.com/token
) yang
mencakup parameter berikut:
Kolom | |
---|---|
client_id |
Client ID yang diperoleh dari API Console. |
client_secret |
Rahasia klien yang diperoleh dari API Console. |
grant_type |
Sebagai
yang didefinisikan dalam
Spesifikasi OAuth 2.0,
nilai kolom ini harus ditetapkan ke refresh_token . |
refresh_token |
Token refresh yang ditampilkan dari pertukaran kode otorisasi. |
Cuplikan berikut menunjukkan contoh permintaan:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=your_client_id& client_secret=your_client_secret& refresh_token=refresh_token& grant_type=refresh_token
Selama pengguna belum mencabut akses yang diberikan ke aplikasi, server token menampilkan objek JSON yang berisi token akses baru. Cuplikan berikut menampilkan contoh respons:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "token_type": "Bearer" }
Perhatikan bahwa ada batasan jumlah token refresh yang akan diterbitkan; satu batas per kombinasi klien/pengguna, dan satu lagi per pengguna di semua klien. Anda harus menyimpan token refresh dalam penyimpanan jangka panjang dan terus menggunakannya selama masih valid. Jika pengajuan permohonan Anda meminta terlalu banyak token refresh, mungkin akan mencapai batas ini, sehingga token refresh yang lebih lama akan berhenti berfungsi.
Mencabut token
Dalam beberapa kasus, pengguna mungkin ingin mencabut akses yang diberikan ke aplikasi. Pengguna dapat mencabut akses dengan mengunjungi Setelan Akun. Lihat Hapus bagian akses situs atau aplikasi di situs pihak ketiga & aplikasi yang memiliki akses ke akun Anda dokumen dukungan untuk informasi selengkapnya.
Aplikasi juga dapat mencabut akses yang diberikan kepadanya secara terprogram. Pencabutan terprogram penting jika pengguna berhenti berlangganan, menghapus aplikasi, atau sumber daya API yang dibutuhkan oleh aplikasi telah berubah secara signifikan. Dengan kata lain, {i>SUMIF<i} memiliki daftar sel bagian dari proses penghapusan dapat mencakup permintaan API untuk memastikan yang diberikan ke aplikasi akan dihapus.
PHP
Untuk mencabut token secara terprogram, panggil revokeToken()
:
$client->revokeToken();
Python
Untuk mencabut token secara terprogram, buat permintaan ke
https://oauth2.googleapis.com/revoke
yang menyertakan token sebagai parameter dan menetapkan
Header Content-Type
:
requests.post('https://oauth2.googleapis.com/revoke', params={'token': credentials.token}, headers = {'content-type': 'application/x-www-form-urlencoded'})
Ruby
Untuk mencabut token secara terprogram, buat permintaan HTTP ke oauth2.revoke
endpoint:
uri = URI('https://oauth2.googleapis.com/revoke') response = Net::HTTP.post_form(uri, 'token' => auth_client.access_token)
Token dapat berupa token akses atau token refresh. Jika token itu adalah token akses dan memiliki token pembaruan yang sesuai, token pembaruan juga akan dicabut.
Jika pencabutan berhasil diproses, kode status responsnya adalah
200
. Untuk kondisi error, kode status 400
ditampilkan bersama dengan
pada kode error Anda.
Node.js
Untuk mencabut token secara terprogram, buat permintaan HTTPS POST ke /revoke
endpoint:
const https = require('https'); // Build the string for the POST request let postData = "token=" + userCredential.access_token; // Options for POST request to Google's OAuth 2.0 server to revoke a token let postOptions = { host: 'oauth2.googleapis.com', port: '443', path: '/revoke', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(postData) } }; // Set up the request const postReq = https.request(postOptions, function (res) { res.setEncoding('utf8'); res.on('data', d => { console.log('Response: ' + d); }); }); postReq.on('error', error => { console.log(error) }); // Post the request with data postReq.write(postData); postReq.end();
Parameter token dapat berupa token akses atau token refresh. Jika token itu adalah token akses dan memiliki token pembaruan yang sesuai, token pembaruan juga akan dicabut.
Jika pencabutan berhasil diproses, kode status responsnya adalah
200
. Untuk kondisi error, kode status 400
ditampilkan bersama dengan
pada kode error Anda.
HTTP/REST
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 pembaruan yang sesuai, token pembaruan juga akan dicabut.
Jika pencabutan berhasil diproses, kode status HTTP respons tersebut adalah
200
. Untuk kondisi error, kode status HTTP 400
ditampilkan bersama
dengan kode error.
Menerapkan Perlindungan Lintas Akun
Langkah tambahan yang harus Anda ambil untuk melindungi akun menerapkan Lintas Akun Perlindungan dengan menggunakan Layanan Perlindungan Lintas Akun Google. Layanan ini memungkinkan Anda berlangganan pemberitahuan peristiwa keamanan yang memberikan informasi ke aplikasi Anda tentang perubahan besar pada akun pengguna. Selanjutnya, Anda dapat menggunakan informasi tersebut untuk mengambil tindakan, bergantung pada bagaimana Anda memutuskan untuk menanggapi peristiwa.
Beberapa contoh jenis peristiwa yang dikirim ke aplikasi Anda oleh Cross-Account Protection Service 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 Melindungi akun pengguna dengan halaman Perlindungan Lintas Akun untuk mengetahui informasi selengkapnya tentang cara menerapkan Perlindungan Lintas Akun dan daftar lengkap peristiwa yang tersedia.