Spring OAuth2Sso все еще может войти в систему пользователя, когда у сервера авторизации нет доступа или токен обновления - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь выйти из системы, используя Spring OAuth2. У меня есть сервер с аннотацией @EnableOAuth2Sso и другой сервер с аннотацией @EnableAuthorizationServer.

Сервер Sso использует поток authorization_code для входа пользователя и имеет конечную точку выхода из системы, которая, в свою очередь, связывается с сервером авторизации, чтобы избавиться от доступа пользователей и обновить маркер.

При вызове эти токены удаляются, так как они больше не отображаются в mongodb, но как только я обновляю свою страницу (подключенную к серверу Sso), я снова автоматически регистрируюсь, так как сервер авторизации создает новый доступ и обновить токен.

Я подозреваю, что мой сервер Sso все еще имеет действительный код авторизации, что позволяет ему запрашивать новые токены с сервера авторизации, но я не могу найти, где сервер авторизации управляет этими кодами авторизации. Кто-нибудь знает, где они хранятся и как я могу сделать недействительными эти коды авторизации? Или я совсем не на том пути?

обновление : я выяснил, что проблема действительно связана с сессиями, как предложил dur. Когда я удаляю cookie-файл сеанса сервера Sso в браузере, я должен повторно пройти аутентификацию на сервере авторизации. Я не могу заставить сервер Sso уничтожить мой cookie, хотя. Я попытался вручную перебрать файлы cookie и завершить их действие следующим образом (помните, что я использую Kotlin):

@RequestMapping("/logout",
        method = [RequestMethod.GET]
)
@ResponseBody
fun redirectToLogout(request: HttpServletRequest) : RedirectView{
    ...
    val uri = authServerInstance.uri.normalize()
    val redirectView = RedirectView()
    redirectView.url = "$uri/auth/logout"

    request.cookies.forEach {
        it.maxAge = 0
    }
    ...
    return redirectView
}

Я также попытался сделать сеанс недействительным следующим образом:

@RequestMapping("/logout",
        method = [RequestMethod.GET]
)
@ResponseBody
fun redirectToLogout(request: HttpServletRequest) : RedirectView{
    ...
    val uri = authServerInstance.uri.normalize()
    val redirectView = RedirectView()
    redirectView.url = "$uri/auth/logout"

    request.session.invalidate()
    ...
    return redirectView
}

В обоих случаях Sso пытается аннулировать сеанс, а затем отправляет запрос на сервер авторизации для аннулирования доступа пользователей и обновления токенов, но каким-то образом куки сеанса не становятся недействительными.

1 Ответ

0 голосов
/ 02 мая 2018

Sso-сервер может просто удалить сессионный cookie.В приведенных ниже примерах я перенаправлял на конечную точку выхода из системы сервера авторизации через Netflix Zuul, что в основном означало, что cookie-файл сеанса сервера Sso все еще использовался на сервере авторизации, что означает, что сервер авторизации не могуничтожить его сеансовый файл cookie, созданный при первоначальном перенаправлении со страницы аутентификации на сервере авторизации.

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

...