Предотвращение необходимости повторного входа с помощью веб-приложения Angular6 / Spring Boot 2 с использованием oauth2 - PullRequest
0 голосов
/ 27 октября 2018

Я пишу небольшое веб-приложение, использующее 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...