google oauth2 redirect_uri với một số tham số


120

Làm cách nào để thêm tham số vào google oauth2 redirect_uri?

Chỉ như thế này redirect_uri=http://www.example.com/redirect.html?a=b.

Các bsố a=blà ngẫu nhiên.

Bất cứ ai có thể giúp đỡ?

Câu trả lời:


235
  1. Bạn không thể thêm bất cứ thứ gì vào tiểu chuyển hướng, tiểu chuyển hướng là không đổi như được đặt trong cài đặt ứng dụng của Oauth. ví dụ: http://www.example.com/redirect.html

  2. Để chuyển một số tham số đến tiểu chuyển hướng của bạn, hãy lưu trữ chúng trong state tham số trước khi gọi url Oauth, url sau khi ủy quyền sẽ gửi cùng một tham số đến tiểu chuyển hướng của bạn như state=THE_STATE_PARAMETERS

Vì vậy, đối với trường hợp của bạn, hãy làm như sau:

/ 1. tạo một chuỗi json các tham số của bạn ->

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

/ 2. thực hiện một base64UrlEncode, để làm cho URL của nó an toàn ->

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

Đây là một ví dụ PHP về base64UrlEncoding & decoding ( http://en.wikipedia.org/wiki/Base64#URL_application ):

function base64UrlEncode($inputStr)
{
    return strtr(base64_encode($inputStr), '+/=', '-_,');
}

function base64UrlDecode($inputStr)
{
    return base64_decode(strtr($inputStr, '-_,', '+/='));
}

Vì vậy, bây giờ trạng thái sẽ giống như: stateString -> asawerwerwfgsg,

Chuyển trạng thái này trong URL ủy quyền 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,

Đối với luồng phía máy chủ, nó sẽ đi kèm với mã thông báo: http://www.example.com/redirect.html?token=sdfwerwqerqwer&state=asdafwswdwefwsdg ,

Đối với luồng phía máy khách, nó sẽ ở dạng băm cùng với mã thông báo truy cập: http://www.example.com/redirect.html#access_token=portyefghsdfgdfgsdgd&state=asdafwswdwefwsdg ,

Truy xuất trạng thái, base64UrlDecode nó, json_decode nó và bạn có dữ liệu của mình.

Xem thêm về google OAuth 2 tại đây:

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


base64 được sử dụng để làm xáo trộn dữ liệu cũng như mã hóa url, nếu bạn cần một chút 'bảo mật' bổ sung thông qua sự che khuất.
ricosrealm

@DhruvPathak hoàn hảo, tôi cần gửi lại một thông số tùy chỉnh với chuyển hướng API linkedin và nó giống như phương pháp bạn đã mô tả.
ericsicons

5
Tham số trạng thái được sử dụng để ngăn chặn các cuộc tấn công CSRF trong quá trình OAuth. Bạn phải đặt mã thông báo trong thông số trạng thái khi bắt đầu luồng và bạn nên kiểm tra xem bạn có nhận lại mã thông báo tương tự trong thông số trạng thái khi redirect_uri của bạn được đánh hay không. Đừng làm những gì được làm trong câu trả lời này. Một giải pháp dựa trên phiên có lẽ là những gì bạn nên xem xét.
Rahim

2
Làm cách nào tôi có thể sử dụng stateparam để chuyển một số tham số để chuyển hướng uri và ngăn chặn CSRFtấn công cùng một lúc ?
hellboy

1
@hellboy Tôi cũng đang thắc mắc điều tương tự. Bạn đã quản lý để thêm một số tham số vào tham số trạng thái (giá trị tùy chỉnh và ngăn chặn CSRFcác cuộc tấn công)?
Kevin Etore

4

Nếu bạn đang ở trong .NET, bạn có thể lưu các tham số trong Phiên

HttpContext.Current.Session[{varname}]

và chuyển hướng đến trang ủy quyền mà không có tham số

Response.Redirect(your_uri_approved_with_no_querystring_parameters);

4
Điều này không mở rộng khi sử dụng một webfarm chẳng hạn như azure.
tiêu vào

3
@spender: vì vậy bạn ngụ ý rằng hai yêu cầu gần như theo trình tự từ cùng một ứng dụng khách có thể được xử lý bởi các máy chủ khác nhau trong webfarm. Nếu đúng như vậy, đây không phải là điều duy nhất bị ảnh hưởng, về cơ bản, biến Phiên không thể được sử dụng trong trường hợp đó cho bất cứ điều gì. BTW: Tôi không tranh luận - thực sự đang cố gắng học hỏi ở đây.
rufo

6
Hoàn toàn có thể xảy ra, vâng ... Bạn có thể giảm thiểu điều này bằng cách quản lý phiên bằng máy chủ phiên hoặc sao lưu phiên vào cơ sở dữ liệu (xem msdn.microsoft.com/en-us/library/ms178586.aspx ) hoặc bật phiên cố định trên bộ cân bằng tải của bạn để đảm bảo rằng các máy khách luôn quay lại cùng một nút máy chủ web. Tất cả các tùy chọn tôi đã đề cập đều là PITA để thiết lập, vì vậy Sessioncần tránh sử dụng IMO, lưu trữ bất kỳ trạng thái máy khách nào .
tiêu

2

Bạn có thể chuyển hướng tham số với url như bên dưới,

Khi bạn nhận được phản hồi từ google hơn bạn có thể chuyển tham số với url,

Xem mã php dưới đây để biết tương tự,

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

}

Trong ví dụ trên r = page / view là tham số mà tôi muốn phản hồi có tham số


Đây là nơi mà tham số trạng thái được gửi trong mã PHP do google cung cấp. Có ba yêu cầu được thực hiện phía máy chủ. Điều này có nghĩa là yêu cầu cuối cùng sẽ không có bất kỳ biến chuỗi truy vấn nào.
lol

hoạt động như một sự quyến rũ! Tôi biết chúng ta có thể gửi thông tin ở trạng thái tham số nhưng nếu ứng dụng đang mong đợi bất kỳ giá trị nào trực tiếp như tham số yêu cầu, thì nó không thành công. Phương pháp bạn đã cung cấp là hoàn hảo cho tình huống này. Cảm ơn!
Jayant Varshney
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.