google oauth2 redirect_uri dengan beberapa parameter

120

Bagaimana cara menambahkan parameter ke google oauth2 redirect_uri?

Seperti ini redirect_uri=http://www.example.com/redirect.html?a=b.

The bdari a=bacak.

Ada yang bisa membantu?

alasan
sumber

Jawaban:

236
  1. 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

  2. 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:

http://code.google.com/apis/accounts/docs/OAuth2.html

DhruvPathak
sumber
base64 digunakan untuk mengaburkan data serta menyandikan url, jika Anda memerlukan sedikit 'keamanan' ekstra melalui ketidakjelasan.
ricosrealm
@DhruvPathak sempurna, saya perlu mengirim kembali parameter khusus dengan pengalihan API tertaut dan itu metode yang sama yang Anda jelaskan.
ericsicons
6
Parameter status digunakan untuk mencegah serangan CSRF selama aliran OAuth. Anda harus menyetel token di parameter status saat memulai aliran dan Anda harus memeriksa apakah Anda mendapatkan kembali token yang sama di parameter status saat redirect_uri Anda terkena. Jangan lakukan apa yang dilakukan dalam jawaban ini. Solusi berbasis sesi mungkin adalah apa yang harus Anda lihat.
Rahim
2
Bagaimana saya dapat menggunakan stateparam untuk melewatkan beberapa parameter untuk mengarahkan uri dan mencegah CSRFserangan pada saat yang bersamaan ?
Hellboy
1
@hellboy Saya bertanya-tanya hal yang sama. Apakah Anda berhasil menambahkan beberapa parameter ke parameter negara (nilai khusus dan mencegah CSRFserangan)?
Kevin Etore
4

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);
rufo
sumber
4
Ini tidak berskala saat menggunakan webfarm seperti azure.
pembelanjaan
3
@spender: jadi Anda menyiratkan bahwa dua permintaan yang hampir berurutan dari klien yang sama mungkin ditangani oleh server berbeda di webfarm. Jika demikian, ini bukan satu-satunya hal yang terpengaruh, pada dasarnya variabel Sesi tidak dapat digunakan dalam skenario itu untuk apa pun. BTW: Saya tidak berdebat - sebenarnya mencoba belajar di sini.
rufo
6
Sangat mungkin, ya ... Anda dapat mengurangi ini dengan mengelola sesi dengan server sesi atau membuat cadangan sesi ke database (lihat msdn.microsoft.com/en-us/library/ms178586.aspx ), atau untuk mengaktifkan sesi lengket pada penyeimbang beban Anda untuk memastikan bahwa klien selalu kembali ke node server web yang sama. Semua opsi yang saya sebutkan adalah PITA untuk disiapkan, jadi IMO, menyimpan status klien apa pun Sessionharus dihindari.
pembelanjaan
2

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

Kiran
sumber
Di sinilah parameter status dikirim dalam kode PHP yang disediakan google. Ada tiga permintaan yang dibuat di sisi server. Ini berarti bahwa permintaan akhir tidak akan memiliki variabel string kueri sama sekali.
lol
bekerja seperti pesona! Saya tahu kami dapat mengirim informasi dalam param negara tetapi jika aplikasi mengharapkan nilai apa pun secara langsung sebagai parameter permintaan, maka itu gagal. Metode yang Anda berikan sangat cocok untuk skenario ini. Terima kasih!
Jayant Varshney
0

Karena jawaban yang diterima mengekspos data aktual dan menyalahgunakan stateparameter 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 stateparameter untuk permintaan tersebut. Simpan nonce bersama dengan status tersuai (mis. Json) di penyimpanan lokal.

Misalnya, nonce bisa jadi ih4f984hfdan 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 stateparameter permintaan. (Jika Anda benar-benar ingin menggabungkan nonce dan data ke dalam statenilai, pastikan untuk mengenkripsinya dan perhatikan bahwa panjang nilainya terbatas!)

Saat menerima respons, Anda mendapatkan nilai stateparameter 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:

Terjebak
sumber