Я пишу небольшое веб-приложение, использующее Spring Boot 2 в качестве бэкэнда и Angular6 / Ionic в качестве внешнего интерфейса. Намерение состоит в том, чтобы пользователи добавляли сайт на свой домашний экран и чтобы он в основном выглядел / чувствовал себя как нативное приложение. Это работает довольно хорошо, но я хотел бы использовать Google для входа в Spring Security Oauth2. Моя проблема заключается в том, что Spring Boot сохраняет пользовательские токены авторизации на сервере, связанном с сеансом, и значок домашнего экрана IOS загружается, и все куки-файлы очищаются при каждом нажатии на значок. Поскольку файл cookie исчезает при загрузке страницы, пользователю необходимо снова войти в систему.
Очевидно, локальное хранилище html5 должно сохраняться от запуска к запуску, поэтому я думаю, что мне нужно сгенерировать ключ для пользователя после аутентификации, который можно сохранить в локальном хранилище на устройстве, а затем, когда пользователь обращается к странице могу предоставить этот ключ, который я могу использовать для «аутентификации» их на сервере ... что-то в этом роде.
Я ищу идеи о том, как разрешить пользователю оставаться в системе "без регистрации" без возможности надежного хранения файлов cookie в течение любого периода времени.
В настоящее время используется
Spring Boot 2
Угловой 6
Ионная 4
Spring Security
Spring Oauth2
Все защищено, кроме страницы входа.
В данный момент я сохраняю сессии в jdbc, и мои конфиги выглядят так:
applicaion.yml
spring.security.oauth2.client.registration.google.client-id=XXXXX
spring.security.oauth2.client.registration.google.client-secret=XXXX
server.servlet.session.persistent=true
spring.session.store-type=jdbc
spring.session.jdbc.initialize-schema=always
MvcConfig.java
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("/static");
registry.addResourceHandler("/static/*.js", "/static/*.css", "/static/*.svg")
.addResourceLocations("/static")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS));
}
}
SecurityConfig.java
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login().and().logout().logoutSuccessUrl("/");
}
}
Я пытался сообщить Spring, чтобы идентификаторы сеанса были указаны в качестве заголовков x-auth, но Google oauth перестает работать. Как и во время перехода на страницу, откройте экран, на котором можно нажать, чтобы войти в систему с помощью Google, войдите с помощью Google, и я вернусь на мою страницу входа с ошибкой: «Ваша попытка входа не удалась, попробуйте еще раз».
Так что в основном Google oauth работает с конфигом, описанным выше, но не работает с этим добавленным в SecurityConfig.java
@Bean
public HttpSessionIdResolver httpSessionIdResolver() {
return new HeaderHttpSessionIdResolver("X-Auth-Token");
}
Это, очевидно, сбой, потому что соответствующая информация о сеансе не передается в / назад от Google. Мой процесс входа в систему производит 3 "сессии"
1) Когда пользователь впервые пытается получить доступ к странице и получает страницу входа
2) При получении ответа токена от Google. Этот сеанс указывает на ошибку «authorization_request_not_found»
3) Когда пользователь перенаправляется обратно на страницу входа.
Похоже, некоторая информация о сеансе передается в / из Google, но идентификатор сеанса выглядит правильно
Запрос в Google Auth:
https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=1111111111111-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com&scope=openid%20profile%20email&state=NGW6kTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%3D&redirect_uri=http://localhost.com:9733/login/oauth2/code/google
Обратный звонок от Google Auth:
http://localhost:9733/login/oauth2/code/google?state=NGW6kTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%3D&code=4/xxxx_xxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&scope=openid+email+profile+https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/plus.me+https://www.googleapis.com/auth/userinfo.email&authuser=0&session_state=6ee92xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..2618&prompt=none