google oauth2 redirect_uri ที่มีพารามิเตอร์หลายตัว


120

จะเพิ่มพารามิเตอร์ลงใน google oauth2 redirect_uri ได้อย่างไร?

เพียงเท่านี้redirect_uri=http://www.example.com/redirect.html?a=b.

bของa=bเป็นแบบสุ่ม

ใครก็ได้ช่วยหน่อย

คำตอบ:


236
  1. คุณไม่สามารถเพิ่มอะไรลงใน uri การเปลี่ยนเส้นทาง uri การเปลี่ยนเส้นทางจะคงที่ตามที่ตั้งไว้ในการตั้งค่าแอปของ Oauth เช่นhttp://www.example.com/redirect.html

  2. ในการส่งผ่านพารามิเตอร์หลายตัวไปยัง uri การเปลี่ยนเส้นทางของคุณให้เก็บไว้ในstate พารามิเตอร์ก่อนที่จะเรียก Oauth url URL หลังการอนุญาตจะส่งพารามิเตอร์เดียวกันไปยัง uri การเปลี่ยนเส้นทางของคุณเป็น state=THE_STATE_PARAMETERS

สำหรับกรณีของคุณให้ทำดังนี้

/ 1 สร้างสตริง json ของพารามิเตอร์ของคุณ ->

{ "a" : "b" , "c" : 1 }

/ 2 ทำ base64UrlEncode เพื่อให้ URL ปลอดภัย ->

stateString = base64UrlEncode('{ "a" : "b" , "c" : 1 }');

นี่คือตัวอย่าง 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, '-_,', '+/='));
}

ตอนนี้สถานะจะเป็นดังนี้: stateString -> asawerwerwfgsg,

ผ่านสถานะนี้ใน URL การให้สิทธิ์ 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,

สำหรับโฟลว์ฝั่งเซิร์ฟเวอร์จะมาพร้อมกับโทเค็น: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg ,

สำหรับโฟลว์ฝั่งไคลเอ็นต์จะมาพร้อมกับแฮชพร้อมกับโทเค็นการเข้าถึง: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg ,

ดึงข้อมูลสถานะ base64UrlDecode it json_decode และคุณมีข้อมูลของคุณ

ดูเพิ่มเติมเกี่ยวกับ Google OAuth 2 ที่นี่:

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


base64 ใช้เพื่อทำให้ข้อมูลสับสนรวมทั้งเข้ารหัส url หากคุณต้องการ 'ความปลอดภัย' เพิ่มเติมเล็กน้อยผ่านความสับสน
ricosrealm

@DhruvPathak สมบูรณ์แบบฉันต้องการส่งพารามิเตอร์ที่กำหนดเองกลับด้วยการเปลี่ยนเส้นทาง API ที่เชื่อมโยงและเป็นวิธีเดียวกับที่คุณอธิบาย
ericsicons

5
พารามิเตอร์ state ใช้เพื่อป้องกันการโจมตี CSRF ระหว่างโฟลว์ OAuth คุณต้องตั้งค่าโทเค็นในพารามิเตอร์ state เมื่อเริ่มต้นโฟลว์และคุณควรตรวจสอบว่าคุณได้รับโทเค็นเดิมกลับมาในพารามิเตอร์ state หรือไม่เมื่อ redirect_uri ของคุณถูกตี อย่าทำสิ่งที่ทำในคำตอบนี้ โซลูชันตามเซสชันน่าจะเป็นสิ่งที่คุณควรพิจารณา
Rahim

2
ฉันจะใช้stateพารามิเตอร์เพื่อส่งผ่านพารามิเตอร์หลายตัวเพื่อเปลี่ยนเส้นทาง uri และป้องกันCSRFการโจมตีในเวลาเดียวกันได้อย่างไร
hellboy

1
@hellboy ฉันสงสัยในสิ่งเดียวกัน คุณจัดการเพิ่มพารามิเตอร์หลายตัวให้กับพารามิเตอร์สถานะ (ค่าที่กำหนดเองและป้องกันCSRFการโจมตี) หรือไม่
Kevin Etore

4

หากคุณอยู่ใน. NET คุณสามารถบันทึกพารามิเตอร์ใน Session

HttpContext.Current.Session[{varname}]

และเปลี่ยนเส้นทางไปยังหน้าการอนุญาตโดยไม่มีพารามิเตอร์

Response.Redirect(your_uri_approved_with_no_querystring_parameters);

4
สิ่งนี้ไม่ได้ปรับขนาดเมื่อใช้เว็บฟาร์มเช่นสีฟ้า
ผู้ใช้จ่าย

3
@spender: ดังนั้นคุณบอกเป็นนัยว่าสองคำขอเกือบตามลำดับจากไคลเอนต์เดียวกันอาจได้รับการจัดการโดยเซิร์ฟเวอร์ที่แตกต่างกันในเว็บฟาร์ม หากเป็นเช่นนั้นนี่ไม่ใช่สิ่งเดียวที่ได้รับผลกระทบโดยทั่วไปตัวแปรเซสชันไม่สามารถใช้ในสถานการณ์นั้นได้ BTW: ฉันไม่ได้เถียง - พยายามเรียนรู้ที่นี่จริงๆ
rufo

6
เป็นไปได้ทั้งหมดใช่ ... คุณสามารถลดสิ่งนี้ได้โดยการจัดการเซสชันด้วยเซิร์ฟเวอร์เซสชันหรือปิดเซสชันการสำรองข้อมูลไปยังฐานข้อมูล (ดูmsdn.microsoft.com/en-us/library/ms178586.aspx ) หรือเพื่อเปิดใช้งานเซสชันที่ติดหนึบ บนตัวจัดสรรภาระงานของคุณเพื่อให้แน่ใจว่าไคลเอนต์กลับไปที่โหนดเว็บเซิร์ฟเวอร์เดียวกันเสมอ ตัวเลือกทั้งหมดที่ฉันกล่าวถึงคือ PITA ในการตั้งค่าดังนั้นSessionควรหลีกเลี่ยงIMO การจัดเก็บสถานะไคลเอ็นต์ใด ๆ
ผู้ใช้จ่าย

2

คุณสามารถเปลี่ยนเส้นทางพารามิเตอร์ด้วย url ดังต่อไปนี้

เมื่อคุณได้รับคำตอบจาก Google เกินกว่าที่คุณจะส่งผ่านพารามิเตอร์ด้วย url ได้

ดูรหัสphpด้านล่างสำหรับสิ่งเดียวกัน

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');

}

ในตัวอย่างข้างต้นr = page / viewคือพารามิเตอร์ที่ฉันต้องการให้ตอบกลับด้วยพารามิเตอร์


นี่คือที่ที่พารามิเตอร์สถานะถูกส่งไปในโค้ด PHP ที่ Google ให้ไว้ มีการร้องขอสามครั้งในฝั่งเซิร์ฟเวอร์ ซึ่งหมายความว่าคำขอสุดท้ายจะไม่มีตัวแปรสตริงการสืบค้นเลย
lol

ใช้งานได้เหมือนมีเสน่ห์! ฉันรู้ว่าเราสามารถส่งข้อมูลในพารามิเตอร์สถานะได้ แต่หากแอปพลิเคชันคาดหวังค่าใด ๆ โดยตรงเป็นพารามิเตอร์คำขอก็จะล้มเหลว วิธีการที่คุณระบุเหมาะสำหรับสถานการณ์นี้ ขอบคุณ!
Jayant Varshney
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.