URL-кодирование параметра состояния для Google oauth2 декодируется во время перенаправления

Я выполняю первоначальную авторизацию для доступа к Google Диску. Я хочу передать полный URL-адрес в параметре «состояние», чтобы я мог выполнить дополнительную переадресацию с имени страницы, которое я отправляю в «redirect_uri». Итак, мой 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&< em>state=https%3a%2f%2fmy.server.com%2fRoot%2fDirectory%2fGoogle.php%3fpid%3dc907a55c-87f8-4ba8-8a16-478a9e6cba70%26prov%3dsrv50758c7a0cfcd6.527662862

Обратите внимание, что параметр «state» закодирован в 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.

***редактировать

Вот необработанный 302 от Google. Должен быть тот же URL, что и вставленный выше.

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

person Brian Roster    schedule 13.02.2013    source источник
comment
Вы уверены, что это не ваш браузер делает это? Я считаю, что хром имеет тенденцию декодировать URL-адреса. Вы пытались получить сырой 302 от Google?   -  person Jerome    schedule 14.02.2013


Ответы (2)


Кодирование URL не требует кодирования '?' или ':' или '/' при отображении в качестве значений параметров запроса. Таким образом, ответы, сгенерированные Google, правильно закодированы и не должны приводить к ошибкам синтаксического анализа на вашем сервере.

person breno    schedule 18.02.2013

Кодирование всего параметра состояния в кодировке Base64 — это безопасный способ вернуть его точно в том виде, в котором вы его отправили.

person Charlie Reitzel    schedule 20.09.2016