Разница между параметром OAuth 2.0 и параметром OpenID "nonce"? Почему состояние не может быть использовано повторно?

OAuth 2.0 определяет параметр "состояние", который должен быть отправлен клиентом в запросе для предотвращения атак на межсайтовый запрос. То же самое упоминается в спецификации OpenID для "nonce". Помимо того факта, что "nonce" возвращается в токене ID вместо параметров запроса, они, похоже, служат той же цели. Если кто-то может объяснить, почему они являются отдельными

Ответ 1

State и nonce кажутся похожими. Но если вы будете копать глубоко, вы обнаружите, что они служат различным целям.

Состояние существует для защиты конечного пользователя от атак подделки межсайтовых запросов (CSRF). Он введен из протокола OAuth 2.0 RFC6749. Протокол гласит, что

После получения разрешения от конечного пользователя    сервер авторизации перенаправляет пользовательский агент конечного пользователя обратно в    клиент с обязательным значением привязки, содержащимся в "состоянии"   параметр. Значение привязки позволяет клиенту проверить    обоснованность запроса путем сопоставления значения привязки с    Состояние аутентификации агента пользователя

И это используется в запросе авторизации. Это позволяет клиенту проверить, что ответ на авторизацию не был изменен и отправлен исходным сервером, который выполняет аутентификацию. Запрос был отправлен. Короче говоря, это позволяет клиенту перепроверить запрос авторизации и ответ.

Nonce служит другой цели. Он связывает токены с клиентом. Он служит параметром проверки токена и представлен в спецификации OpenID Connect.

nonce - строковое значение, используемое для связи сеанса клиента с идентификатором токена и для предотвращения атак воспроизведения. Значение передается неизмененным из запроса аутентификации на токен идентификатора. Если он присутствует в токене идентификатора, клиенты ДОЛЖНЫ проверять, что значение утверждения одноразового номера равно значению параметра одноразового номера, отправленного в запросе на аутентификацию. Если они присутствуют в запросе на аутентификацию, серверы авторизации ДОЛЖНЫ включать Заявку о одноразовом назначении в маркер идентификатора, причем значением утверждения является значение одноразового номера, отправленное в Запросе на аутентификацию. Серверы авторизации СЛЕДУЕТ не выполнять никакой другой обработки используемых значений nonce. Значение nonce является чувствительной к регистру строкой

Как видите, значение nonce происходит из запроса авторизации и генерируется клиентом. И если одноразовый номер включен, он будет присутствовать в токене. Таким образом, клиент может проверить полученный токен в соответствии с первоначальным запросом авторизации, тем самым обеспечивая действительность токена.

Кроме того, в зависимости от типа потока, nonce может быть обязательным параметром. Значение nonce мандата неявного потока и гибридного потока. Оба значения генерируются и проверяются клиентским приложением.

Почему государство не может быть повторно использовано?

Если запрос на авторизацию получен, злоумышленник может подделать ответ на запрос авторизации. Этого можно избежать, изменив параметр состояния.

Ответ 2

Я излагаю объяснения из своих RFC. Объяснение довольно простое и самоочевидное.

Государственные

     An opaque value used by the client to maintain
     state between the request and callback.  The authorization
     server includes this value when redirecting the user-agent back
     to the client.  The parameter SHOULD be used for preventing
     cross-site request forgery

Nonce

     The nonce parameter value needs to include per-session state and be unguessable 
     to attackers. One method to achieve this for Web Server Clients is to store a 
     cryptographically random value as an HttpOnly session cookie and use a 
     cryptographic hash of the value as the nonce parameter. In that case, the nonce 
     in the returned ID Token is compared to the hash of the session cookie to detect 
     ID Token replay by third parties. A related method applicable to JavaScript 
     Clients is to store the cryptographically random value in HTML5 local storage 
     and use a cryptographic hash of this value.

Надеюсь, что это отвечает на ваш вопрос.