我必须将我的系统与第三方提供商集成。该系统由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吗?
答案 0 :(得分:1)
您可以使用Spring Security。流程如下。您对安全令牌服务进行身份验证。包含身份验证令牌的cookie将写入您的浏览器。此令牌将在针对服务器的每个后续请求中发送。
在其余服务器上,您将使用Srping Security,更具体地说,您需要在其实现中使用AbstractPreAuthenticatedProcessingFilter,您将提取令牌并将其与安全上下文相关联。
以下是spring security
的示例配置@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;
}
}
答案 1 :(得分:0)
是的,您可以使用Spring Oauth2。您必须实现资源所有者密码凭据授予Oauth2流。 您必须为最终用户创建登录页面,并且您的客户端应用程序将向授权服务器发送用户的凭据以及客户端系统凭据(使用客户端系统凭据的HTTP基本身份验证)以获取令牌。
有两种方法可以实现它 -
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();
}
现在您可以使用以下 -
注意 - 此流程不如其他Oauth2流程安全,仅推荐用于受信任的客户端应用,因为用户必须向客户端应用提供凭据。
答案 2 :(得分:0)
见这里的例子
将JWT与具有Angular的Spring Security OAuth2一起使用
在本教程中,我们将讨论如何使用Spring Security OAuth2实现来使用JSON Web令牌。
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;
}
}