В OpenID Connect Basic Client Implementer's Guide претензиях в разделе 2.1.6.1, что клиент должен отправить запрос на POST
/token
маршрут поставщика удостоверений для обмена кода авторизации для маркеров.Замена коды для маркеров в OpenID Connect коды авторизации потоке
Образец показано, выглядит следующим образом:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
Я прекрасно понимаю, почему один должен предоставить параметр grant_type
, и я также понимаю, почему вы должны предоставить code
.
Но я смотрю на раздел 2.1.6.2 ответ не дается с помощью редиректа, но, отправив простой 200
ответ с JSON-закодирован тела:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
Pragma: no-cache
{
"access_token":"SlAV32hkKG",
"token_type":"Bearer",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"id_token":"eyJ0 ... NiJ9.eyJ1c ... I6IjIifX0.DeWt4Qu ... ZXso"
}
Нет, я задаюсь вопросом, если ответ это не с использованием перенаправления, но напрямую отправляется клиенту, то почему в вышеуказанном запросе содержится параметр redirect_uri
?
Это ошибка копирования/вставка из раздела 2.1.2, где первоначально запрашивается код авторизации, или я что-то не хватает?
I * почти * получен ;-). Осталось только одно: почему «злоумышленник [...] не использует другой URI переадресации, чтобы обменять« код »авторизации на токен.»? Конечно, очевидно, что он должен соответствовать, поэтому он не может быть * другим *, но если злоумышленник сможет получить код, не смогут ли они получить перенаправление uri? AFAICS перенаправление uri не используется для реального перенаправления, только для сравнения, не так ли? –
Правда. Он используется только для сравнения «redirect_uri» с «redirect_uri», первоначально отправленным клиентским приложением. На практике это полезно только в очень специфических сценариях, поскольку сравнение 'client_id' уже предотвращает запутанные заместительные атаки (когда клиентскому приложению будет предоставлен код авторизации, выданный другому клиенту). Типичные случаи использования включают приложения, которые используют один и тот же «client_id», но имеют разные «redirect_uri», которые указывают на разные разделы приложения. Сравнение «redirect_uri» гарантирует, что код будет заменен правильным компонентом вашего приложения. – Pinpoint
. Другой (теоретический) вариант использования - это когда сервер авторизации позволяет клиентским приложениям регистрироваться без необходимости перечислять «redirect_uri», которые они будут использовать. В этом случае эта контрмера чрезвычайно важна, поскольку сервер авторизации не может обнаружить, что злоумышленник пытается заставить жертву перенаправляться на поддельную «redirect_uri» во время запроса авторизации (так как сервер не может сравнивать его с список известных URL-адресов). На практике эта атака встречается крайне редко, так как большинство серверов авторизации требуют регистрации «redirect_uri» при создании клиентского приложения. – Pinpoint