Câu trả lời:
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
Để 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:
state
param để chuyển một số tham số để chuyển hướng uri và ngăn chặn CSRF
tấn công cùng một lúc ?
CSRF
các cuộc tấn công)?
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);
Session
cần tránh sử dụng IMO, lưu trữ bất kỳ trạng thái máy khách nào .
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ố