Как реализовать токены обновления в веб-приложении - angularjs
Я использую маркерную защиту в своем веб-приложении. На стороне сервера написано с использованием C#, и я использую openiddict для входа в систему и выдачи токенов, найденных здесь. Я использую валюту Implict flow.
По умолчанию мои токены имеют срок службы 1 час, после чего вам нужно снова войти в систему. Я заблокировал свой API, чтобы принимать только токены на предъявителя, а не куки.
Я хотел реализовать токены обновления, но после прочтения многих веб-сайтов выяснилось, что реализация токенов обновления в веб-приложении не является хорошим способом, поскольку хакер получает токен обновления. Я знаю, что для использования токенов обновления вы должны использовать поток кода, а не имплик, что я могу сделать.
Как люди могут обойти эту ситуацию в своих веб-приложениях? Я не могу быть единственным, кто хочет, чтобы токен длился дольше часа в веб-приложении?
1 ответ
Подход, рекомендованный OpenID Connect, заключается в отправке запроса авторизации в скрытом фрейме с теми же параметрами, что и те, которые вы используете для начального запроса неявного потока плюс prompt=none
и, необязательно, id_token_hint
соответствует id_token
Вы извлекли из ответа авторизации.
Когда используешь prompt=none
поставщик удостоверений не будет отображать форму согласия и будет напрямую перенаправлять пользовательский агент на redirect_uri
Вы указываете, с новым токеном, добавленным к фрагменту URI, точно так же, как для классического неявного запроса потока. Вы можете получить его, извлекая его из popup.location.hash
имущество.
Если запрос не может быть обработан (неверный запрос, не прошедший проверку пользователь, недействительный id_token_hint
, требуется согласие и т. д.), возвращается ошибка, и провайдер идентификации либо перенаправляет пользовательский агент на redirect_uri
с error
параметр или останавливает обработку запроса.
Обратите внимание, что из-за той же политики происхождения, вы не можете получить доступ popup.location.hash
если текущее местоположение принадлежит другому домену (например, если провайдер идентификации отказывается перенаправить пользовательский агент в ваше клиентское приложение): он выдаст исключение, запрещающее доступ. В этом случае всегда лучше добавить тайм-аут к вашей операции "обновления".
К сожалению, существует очень мало библиотек, которые могут помочь вам с этой задачей. oidc-token-manager является одним из них, но у него есть несколько ограничений, которые не позволяют ему работать OTB с OpenIddict: он не поддерживает необработанные ключи RSA (вы должны явно использовать сертификат X509 в опциях OpenIddict) и он не отправляет id_token_hint
параметр, необходимый для OpenIddict при отправке prompt=none
запрос.