Режимы возврата ответа о результате авторизации
В OAuth 2.0 сценариях использования с кодом авторизации (AuthorizationCode) и с неявным разрешением (Implicit Flow) возврат ответа может осуществляться различными способами. В СЭП КриптоПро DSS поддерживаются три:
- Возврат результата в строке запроса (
query
). - Возврат результата во фрагменте URL-адреса (
fragment
). - Возврат резуьтата через отправку HTML-форы (
form_post
).
В скобках приведены значения параметра response_mode
запроса на
авторизацию, который необходимо указать для того, чтобы сервер вернул ответ
в соответствующем режиме.
Возврат результата в строке запроса
При использовании данного метода сервис авторизации возвращает HTTP ответ со
статусом 302 Found
, в заголовкe Location
указывается redirect_uri
,
переданный в запросе на авторизацию, все параметры ответа помещаются в строку
запроса (query string).
Если в запросе на авторизацию явно не указан режим возврата ответа, то по умолчанию используется данный режим.
Пример 1
GET /STS/oauth/authorize?
client_id=eea2fd3f-5c70-4d74-a594-f1e7bf81b4d7
&resource=https%3A%2F%2Fdss.cryptopro.ru%2FSignServer%2Frest%2Fapi
&redirect_uri=http%3A%2F%2F127.0.0.1%3A9158%2F
&response_type=code HTTP/1.1
HTTP/1.1 302 Found
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Location: http://127.0.0.1:9158/?code=399c0f1dfc694f34f9d10ce7c5bc28a8
Content-Length: 0
Значения параметров кодируются с помощью кодировки
application/x-www-form-urlencoded
(см. RFC-6749).
Возврат результата в URL-фрагменте
Данный метод совпадает с предыдущим за исключением того, что параметры возвращаются в URL-фрагменте:
Пример 2
GET /STS/oauth/authorize?
client_id=eea2fd3f-5c70-4d74-a594-f1e7bf81b4d7
&resource=https:%2f%2fdss.cryptopro.ru%2fSignServer%2frest%2fapi
&redirect_uri=http:%2f%2f127.0.0.1:9158%2f
&response_type=token&response_mode=fragment HTTP/1.1
HTTP/1.1 302 Found
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Location: http://127.0.0.1:9158/#access_token=eyJ0e&token_type=Bearer&expires_in=300
Content-Length: 0
Возврат результата через отправку HTML формы
Данный режим подходит для возврата результата в том случае, когда значения
параметров представляют собой длинные строки, так как часто браузеры и ОС
накладывают ограничения на длину заголовков HTTP ответа, в том числе и заголовка
Location
.
В данном режиме сервис авторизации в ответ на запрос авторизации возвращает
HTML страницу, содержащую HTML форму и JavaScript, который автоматически
отправляет данную форму после загрузки страницы. Параметр action
данной
формы (т.е. адрес, куда она будет отправлена) устанавливается равным значению
redirect_uri из запроса на авторизацию. Сама форма содержит поля (элементы
html input элементы), соответствующие параметрам ответа.
Пример 3
GET /STS/oauth/authorize?
client_id=eea2fd3f-5c70-4d74-a594-f1e7bf81b4d7
&resource=https:%2f%2fdss.cryptopro.ru%2fSignServer%2frest%2fapi
&redirect_uri=http:%2f%2f127.0.0.1:9158%2f
&response_type=token
&response_mode=form_post HTTP/1.1
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 2818
Content-Type: text/html
Expires: -1
Date: Wed, 15 Aug 2018 07:37:56 GMT
<!DOCTYPE html><html><head><title>Submit this form</title><meta name='viewport' content='width=device-width, initial-scale=1.0' /></head>
<body><form method='post' action='http://127.0.0.1:9158/'>
<input type="hidden" name="access_token" value="eyJ0eXAi" />
<input type="hidden" name="token_type" value="Bearer" />
<input type="hidden" name="expires_in" value="300" />
</form><script>(function(){document.forms[0].submit();})();</script></body></html>
Возврат ошибок
Так как ошибки авторизации возвращаются как параметры ответа, для них используются те же режимы.
Пример 4
GET /STS/oauth/authorize?
client_id=eea2fd3f-5c70-4d74-a594-f1e7bf81b4d7
&resource=https:%2f%2fdss.cryptopro.ru%2fSignServer%2frest%2fapi
&redirect_uri=ru.cryptopro.dss:%2f%2foauth2redirect%2fcloudcsp
&response_type=token
&response_mode=form_post HTTP/1.1
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 358
Content-Type: text/html
Expires: -1
Date: Wed, 15 Aug 2018 07:45:58 GMT
<!DOCTYPE html><html><head><title>Submit this form</title><meta name='viewport' content='width=device-width, initial-scale=1.0' /></head><body>
<form method='post' action='ru.cryptopro.dss://oauth2redirect/cloudcsp'>
<input type="hidden" name="error" value="login_required" />
</form><script>(function(){document.forms[0].submit();})();</script></body></html>
Наличие ошибки можно определить по существованию параметра error
,
дополнительно в ответе может содержаться параметр error_description
,
содержащий более подробное описание ошибки.