Jawaban:
Anda tidak dapat menambahkan apa pun ke uri pengalihan, uri pengalihan konstan seperti yang ditetapkan dalam pengaturan aplikasi Oauth. mis .: http://www.example.com/redirect.html
Untuk meneruskan beberapa parameter ke uri pengalihan Anda, simpan di state
parameter sebelum memanggil url Oauth, url setelah otorisasi akan mengirimkan parameter yang sama ke uri pengalihan Anda seperti
state=THE_STATE_PARAMETERS
Jadi untuk kasus Anda, lakukan ini:
/ 1. buat string json parameter Anda ->
{ "a" : "b" , "c" : 1 }
/ 2. lakukan base64UrlEncode, untuk membuatnya aman URL ->
stateString = base64UrlEncode('{ "a" : "b" , "c" : 1 }');
Ini adalah contoh PHP base64UrlEncoding & decoding ( http://en.wikipedia.org/wiki/Base64#URL_applications ):
function base64UrlEncode($inputStr)
{
return strtr(base64_encode($inputStr), '+/=', '-_,');
}
function base64UrlDecode($inputStr)
{
return base64_decode(strtr($inputStr, '-_,', '+/='));
}
Jadi sekarang statusnya akan menjadi seperti: stateString -> asawerwerwfgsg,
Teruskan status ini di URL otorisasi OAuth:
https://accounts.google.com/o/oauth2/auth?
client_id=21302922996.apps.googleusercontent.com&
redirect_uri=https://www.example.com/back&
scope=https://www.google.com/m8/feeds/&
response_type=token&
state=asdafwswdwefwsdg,
Untuk aliran sisi server, itu akan datang bersama dengan token: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg ,
Untuk aliran sisi klien, ini akan datang dalam hash bersama dengan token akses: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg ,
Ambil status, base64UrlDecode itu, json_decode itu, dan Anda memiliki data Anda.
Lihat lebih lanjut tentang google OAuth 2 di sini:
state
param untuk melewatkan beberapa parameter untuk mengarahkan uri dan mencegah CSRF
serangan pada saat yang bersamaan ?
CSRF
serangan)?
Jika Anda berada di .NET Anda bisa menyimpan parameter di Sesi
HttpContext.Current.Session[{varname}]
dan mengarahkan ke halaman otorisasi tanpa parameter
Response.Redirect(your_uri_approved_with_no_querystring_parameters);
Session
harus dihindari.
Anda dapat mengarahkan parameter dengan url seperti di bawah ini,
Ketika Anda mendapatkan respon dari google daripada Anda dapat mengirimkan parameter dengan url,
Lihat di bawah kode php untuk hal yang sama,
if (isset($_GET['code'])) {
$client->authenticate();
$_SESSION['token'] = $client->getAccessToken();
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL) . '?r=page/view');
}
Dalam contoh di atas, r = halaman / tampilan adalah parameter yang saya ingin respons dengan parameter
Karena jawaban yang diterima mengekspos data aktual dan menyalahgunakan state
parameter alih-alih menggunakan nonce untuk melindungi terhadap CSRF, saya akan mencoba menunjukkan metode yang tepat. Daripada meneruskan (membaca mengekspos ) data, data harus disimpan secara lokal. Hidrasi sebelum permintaan dan hidrat ulang setelah permintaan divalidasi . "Divalidasi" di sini berarti keadaan nonce permintaan dan respons cocok.
Anda memerlukan semacam penyimpanan sisi klien sementara . Misalnya untuk SPA atau situs web umum, pertahankan statusnya atau gunakan Penyimpanan lokal browser, sesi (atau cookie yang ditandatangani ). Untuk aplikasi seluler, mereka harus menggunakan memori atau penyimpanan lokal lainnya.
Sebelum mengirim permintaan, buat nonce (lihat di bawah) yang akan digunakan sebagai state
parameter untuk permintaan tersebut. Simpan nonce bersama dengan status tersuai (mis. Json) di penyimpanan lokal.
Misalnya, nonce bisa jadi ih4f984hf
dan status kustom {"role": "customer"}
. Kemudian Anda dapat menyimpan data untuk rehidrasi untuk permintaan tersebut seperti ini:
"ih4f984hf": {
"role": "customer"
}
Kemudian gunakan hanya nonce sebagai nilai untuk state
parameter permintaan. (Jika Anda benar-benar ingin menggabungkan nonce dan data ke dalam state
nilai, pastikan untuk mengenkripsinya dan perhatikan bahwa panjang nilainya terbatas!)
Saat menerima respons, Anda mendapatkan nilai state
parameter kembali. Cari dan jika cocok dengan nilai di penyimpanan lokal, Anda dapat memproses data menggunakan status tersimpan. Jika nonce tidak cocok, permintaan tersebut berpotensi dari penyerang dan tidak boleh diproses.
Menghasilkan nonce
Ingatlah bahwa sifat nonce adalah digunakan sekali saja dan tidak dapat diprediksi! Unpredictable di sini berarti idealnya acak, tetapi secara praktis pseudo-random tidak masalah jika entropri cukup tinggi - di aplikasi web Anda mungkin ingin memeriksa Kripto API Web yang didukung dengan cukup baik.
Untuk bacaan lebih lanjut, ini mungkin bisa membantu: