2013-02-13 14 views
1

我正在爲Google雲端硬盤訪問執行初始授權。我想在「狀態」參數中傳遞一個完整的URL,這樣我就可以從我在「redirect_uri」中發送的頁面名稱進行額外的重定向。所以我的請求的URL看起來像這樣...谷歌oauth2的狀態參數的URL編碼在重定向期間被解碼

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=000000000000.apps.googleusercontent.com&redirect_uri=https%3A%2F%2Fmy.server.com%2Fx%2Fws-catch.php&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&access_type=offline&狀態= HTTPS%3A%2F%2fmy.server.com%2fRoot%2fDirectory%2fGoogle.php%3fpid%3dc907a55c-87f8-4ba8-8a16-478a9e6cba70 %26prov%3dsrv50758c7a0cfcd6.527662862

注意「狀態」參數是URL編碼的。 Google文檔說這個參數是被雙向跳過的,所以我得到了我傳入的值。但是,狀態參數在達到「redirect_uri」中指定的頁面時似乎得到了部分解碼。這裏就是瀏覽器去時,我拒絕了身份驗證的請求......

https://my.server.com/x/ws-catch.php?error=access_denied&state=https://my.server.com/Root/Directory/Google.php?pid%3Dc907a55c-87f8-4ba8-8a16-478a9e6cba70%26prov%3Dsrv50758c7a0cfcd6.527662862

通知未編碼的「?」字符現在處於「狀態」參數中。這是Google重定向時的問題嗎?我讀了一篇文章,建議base64編碼我可以做的參數,但我想了解爲什麼它不適用於URL編碼。

***編輯

這是Google的原始302。應該與上面粘貼的網址相同。

HTTP/1.1 302 Moved Temporarily 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: Fri, 01 Jan 1990 00:00:00 GMT 
Date: Thu, 14 Feb 2013 16:23:37 GMT 
Location: https://my.server.com/x/ws-catch.php?error=access_denied&state=https://my.server.com/Root/Directory/Google.php?pid%3Dc907a55c-87f8-4ba8-8a16-478a9e6cba70%26prov%3Dsrv50758c7a0cfcd6.527662862 
Content-Type: text/html; charset=UTF-8 
Content-Encoding: gzip 
X-Content-Type-Options: nosniff 
X-Frame-Options: SAMEORIGIN 
X-XSS-Protection: 1; mode=block 
Content-Length: 325 
Server: GSE 
+0

你確定這不是你的瀏覽器嗎?我相信chrome傾向於解碼URL。您是否試圖從Google獲取原始302? – Jerome 2013-02-14 16:00:02

回答

1

URL編碼不需要編碼'?'或當出現查詢參數值時顯示':'或'/'。因此,Google生成的響應都是正確編碼的,不會導致服務器出現任何分析錯誤。

0

Base64對整個狀態參數進行編碼是安全的方式,可以完全按照您發送它的方式將其恢復。