Как я могу реализовать пользовательскую аутентификацию?

Мне нужно интегрировать мою систему со сторонним провайдером. Эта система сделана с помощью Spring и Angular.

Имейте в виду, что мне нужно создать пользовательскую форму входа вместо перенаправления на форму стороннего поставщика, например OAuth2.

Он создал следующие конечные точки:

Получить аутентификацию по токену

POST http://example.com/webapi/api/web/token

“username=972.344.780-00&password=123456&grant_type=password”

Ответ отправляет мне токен, который я должен использовать во всех следующих запросах.

Получить информацию о пользователе

Authorization: Bearer V4SQRUucwbtxbt4lP2Ot_LpkpBUUAl5guvxAHXh7oJpyTCGcXVTT-yKbPrPDU9QII43RWt6zKcF5m0HAUSLSlrcyzOuJE7Bjgk48enIoawef5IyGhM_PUkMVmmdMg_1IdIb3Glipx88yZn3AWaneoWPIYI1yqZ9fYaxA-_QGP17Q-H2NZWCn2lfF57aHz8evrRXNt_tpOj_nPwwF5r86crEFoDTewmYhVREMQQjxo80

GET http://example.com/webapi/api/web/userInfo

Тем не менее, что мне нужно для реализации пользовательской аутентификации?

Могу ли я использовать Spring OAuth2 в этом случае?


person Murillo Goulart    schedule 27.10.2017    source источник
comment
Вы можете найти пример с spring oauth2 и angular по этой ссылке: baeldung.com/rest -api-spring-oauth2-angularjs   -  person Samir    schedule 05.11.2017
comment
Я настоятельно рекомендую этот пример/руководство — › Аутентификация JWT с Spring Boot svlada.com/jwt-token-authentication-with-spring-boot/   -  person Harsha Jayamanna    schedule 05.11.2017


Ответы (3)


вы можете использовать Spring Security. Поток следующий. Вы проходите аутентификацию в службе токенов безопасности. Файл cookie, содержащий токен аутентификации, записывается в ваш браузер. Этот токен отправляется при каждом последующем запросе к серверу.

На остальном сервере вы будете использовать Srping Security, и, более конкретно, вам нужно использовать AbstractPreAuthenticatedProcessingFilter в его реализации, вы извлечете токен и свяжете его с контекстом безопасности.

Вот пример конфигурации вашей весенней безопасности

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


  @Bean
  public AuthenticationManager authenticationManagerBean() throws Exception {
    // TODO Auto-generated method stub
    return super.authenticationManagerBean();
  }

  public void configure(WebSecurity web) throws Exception {
        // do some configuration here
  }

  @Override
  public void configure(HttpSecurity http) throws Exception {
       // configure your Security here 
       // you can add your implementation of AbstractPreAuthenticatedProcessingFilter here
  }

}

Вот ваша дополнительная конфигурация

@Configuration
public class ExampleSpringSecurityConfig{


    @Bean
    public AuthenticationManager authenticationManager() {
        return authentication -> authProvider().authenticate(authentication);
    }

    private AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> userdetailsService() {
       // Construct your AuthenticationUserDetailsService here
   }

    @Bean
    public PreAuthenticatedAuthenticationProvider authProvider() {
        PreAuthenticatedAuthenticationProvider authProvider = new PreAuthenticatedAuthenticationProvider();
        authProvider.setPreAuthenticatedUserDetailsService(userdetailsService());
        return authProvider;
    }





}
person Alexander Petrov    schedule 01.11.2017
comment
Где конечная точка входа/выхода? Где хранить полученный токен? - person Murillo Goulart; 06.11.2017
comment
Токен будет автоматически храниться в обработчике субъекта с помощью Spring Security. Это делается абстрактным классом PreAuthenticatedAuthenticationToken. Выход из системы является частью Token Provider. Например, если вы используете OpenAM, сам OpenAM поставляется с входом и выходом из системы. - person Alexander Petrov; 08.11.2017

Да, вы можете использовать Spring Oauth2. Вы должны реализовать поток предоставления учетных данных пароля владельца ресурса Oauth2. Вам необходимо создать страницу входа для конечного пользователя, и ваше клиентское приложение отправит учетные данные пользователя, а также учетные данные вашей клиентской системы (используйте базовую аутентификацию HTTP для учетных данных клиентской системы) на сервер авторизации для получения токена.

Есть два способа реализовать это-

  1. Использование идентификатора системы клиента и пароля. При вызове конечной точки токена с использованием этого типа гранта вам необходимо передать идентификатор клиента и секрет (используя базовую аутентификацию).

curl -u 972.344.780-00:123456 "http://example.com/webapi/api/web/token?grant_type=password&username=addEndUserNameHere&password=addEndUserPasswordHere"

  • Использование только идентификатора системы клиента (без пароля системы клиента). Сервер авторизации должен иметь настройку клиента для поддержки этого потока без пароля.

Дочерний класс AuthorizationServerConfigurerAdapter должен иметь следующий код:

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {    
        clients.inMemory()
            .withClient("clientId")
            .authorizedGrantTypes("password")
            .authorities("ROLE_CLIENT")
            .scopes("read");
    }
 }

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
    oauthServer.allowFormAuthenticationForClients();
}

Теперь вы можете использовать ниже-

POST http://example.com/webapi/api/web/token?grant_type=password&client_id=my-trusted-client&scope=trust&username=addEndUserNameHere&password=addEndUserPasswordHere

Примечание. Этот поток менее безопасен, чем другие потоки Oauth2, и рекомендуется для доверенного клиентского приложения только потому, что пользователь должен предоставить учетные данные для клиентского приложения.

person ManishSingh    schedule 31.10.2017
comment
Где конечная точка входа/выхода? Где хранить полученный токен? - person Murillo Goulart; 31.10.2017
comment
Конечная точка входа — конечная точка токена используется для получения токена доступа, обработки пользователя как пользователя, вошедшего в систему, если токен действителен. Этот поток не поддерживается идентификатором подключения OpenID. - person ManishSingh; 31.10.2017
comment
Сохраните токен. Вы можете сохранить его в локальном хранилище браузера, если вы используете Angular. - person ManishSingh; 31.10.2017
comment
Конечная точка выхода — для этого потока нет конечной точки выхода, токен просто удален из локального хранилища. - person ManishSingh; 31.10.2017
comment
Пожалуйста, дайте мне знать, если у вас есть еще вопросы. И вы можете получить более подробную информацию по этой ссылке - linkedin.com/ пульс/ - person ManishSingh; 31.10.2017

См. здесь пример

Использование JWT с Spring Security OAuth2 с Angular

В этом руководстве мы обсудим, как заставить нашу реализацию Spring Security OAuth2 использовать веб-токены JSON.

http://www.baeldung.com/spring-security-oauth-jwt

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore())
                 .accessTokenConverter(accessTokenConverter())
                 .authenticationManager(authenticationManager);
    }

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("123");
        return converter;
    }

    @Bean
    @Primary
    public DefaultTokenServices tokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        defaultTokenServices.setSupportRefreshToken(true);
        return defaultTokenServices;
    }
}
person аlex dykyі    schedule 06.11.2017