#java #spring #spring-boot #oauth-2.0 #single-page-application
#java #spring #spring-boot #oauth-2.0 #одностраничное приложение
Вопрос:
Я пытаюсь реализовать автоматическую аутентификацию для моего сервера авторизации Spring Boot (созданного через @EnableAuthorizationServer), чтобы я мог запрашивать новые токены доступа из моего SPA.
Я полагаю, что для этого мне сначала нужно каким-то образом убедить мой сервер авторизации OAuth2 сохранять зарегистрированных пользователей в сеансе.
Я не смог найти никакой информации о том, как решить мою проблему в Интернете. Я предполагаю, что аннотация @EnableAuthorizationServer каким-то образом отключает хранилище сеанса, но я не смог найти, где это происходит.
Допустим, я «вхожу» на свой сервер аутентификации следующим образом:
curl -X POST
http://localhost:8080/oauth/token
-H 'Authorization: Basic Y2xpZW50OnNlY3JldA=='
-H 'content-type: multipart/form-data
-F grant_type=password
-F username=demo
-F password=demo
Вышеуказанное, конечно, предоставит мне токен доступа. Однако я хотел бы, чтобы сервер аутентификации поддерживал пользователя в сеансе, чтобы я мог получить доступ к контроллеру ниже БЕЗ этого токена доступа:
// This controller is in my Auth Server
@RestController
public class SecurityController {
@GetMapping("silentauth")
public String silentAuth(Principal principal) {
return principal.toString();
}
}
Идея в том, что как только я реализую вышеописанное, я смогу предоставить конечную точку для «обновления токенов», где сервер авторизации предоставит новый токен, только если пользователь в данный момент «авторизован» на этом сервере.
Комментарии:
1. вы пробовали Springboot 2.2.0? у него последняя версия Spring Security, обычно вам ничего не нужно делать, поскольку на стороне клиента вы получаете
SESSIONID
cookie2. Вы говорите о стандартной аутентификации с отслеживанием состояния, предоставляемой Spring Boot. К сожалению, здесь это мне не поможет.
3. хорошо, но, возможно, если вы заглянете в SessionRepository или SecurityContextHolder, это может помочь
4. Как сервер аутентификации должен определить, какой пользователь вызывает
silentauth
конечную точку? Эта информация должна каким-то образом сохраняться в HTTP-запросе, потому что сам HTTP логически не имеет состояния.