В спецификации OAuth2 указано, что сервер авторизации не должен выдавать токен обновления при использовании неявного разрешения. В нашем случае мы защищаем RESTful API с OAuth2 и используем приложение Single Page Javascript как клиент для этого API. Поскольку было бы очень сложно перенаправить на сервер авторизации после того, как токен доступа истёк, мы ищем лучший способ получить новый действительный токен. Я мог бы думать о двух разных подходах и удивляться, какой из них может быть лучше:
-
Используйте скрытый iframe для повторной проверки допустимого токена доступа. Для этого необходимо включить параметр "prompt = none", который сообщает провайдеру OAuth ни о вызове проверки подлинности, ни в отображении страницы авторизации. Если пользователь аутентифицирован и авторизовал приложение, сервер отправит токен доступа в параметры URL-адресов. Если одно из предыдущих условий не выполнено, оно будет перенаправлено с ошибкой, например # error = authentication %20lost. При таком поведении мы можем использовать краткосрочные токены доступа также с неявным потоком.
-
Мы могли бы использовать дополнительную область (например, офлайн), которая сообщает серверу передать токен обновления. Даже если исходная спецификация говорит о том, что неявный поток не выдаёт токены обновления (это верно, если клиент использует OAuth только для первой авторизации), вы можете свободно определять свои собственные области для своего конкретного приложения. Вы должны учитывать только эту область видимости от известных клиентов.
Оба подхода очень похожи на оба подхода OpenID Connect. К сожалению, на данный момент в OpenID Connect не так много реализаций. Таким образом, первым шагом будет расширение сервера OAuth2 до тех пор, пока OIC не станет более популярным.
Итак, какой подход должен быть предпочтительным?
EDIT: конечной точке маркера требуется аутентификация клиента, что возможно только для конфиденциальных клиентов, таких как серверные приложения. Со вторым подходом можно было бы позволить RESTful API в нашем случае поставщику ресурсов обновить токен и отправить его клиенту. Я думаю, что это будет угрозой безопасности. Поэтому, вероятно, у нас есть только один действительный подход.