我使用Spring集成的Oauth2创建了一个应用程序.我有自己的自定义登录和授权模板.成功通过身份验证后,它会重定向到授权.html,要求用户批准.问题是当我点击甚至批准或拒绝按钮操作总是拒绝,如下表所示
另外,我们如何使用oauth2启用基于REST的身份验证和授权.我尝试禁用csrf以使用户能够进行身份验证和授权,但仍然无法正常工作.
任何人都可以帮我这个.
您可以从here下载并查看完整申请表(根据上一个建议更新于19/11/2017)
更新1
根据@fateddy的建议,我使用ApprovalStoreUserApprovalHandler使用了选项3.我使用了确切的authorize.html.
假设我的数据库中有两个客户端(client123和client789).
客户端client123未启用自动批准,客户端client789启用了openid范围的自动批准选项.
现在的问题是,当我单击批准按钮时,我收到client123的以下异常.
error =“invalid_client”,error_description =“错误的客户端凭据”
OAuth2Config.java如下所示
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Bean
public UserApprovalHandler userApprovalHandler() {
ApprovalStoreUserApprovalHandler userApprovalHandler= new ApprovalStoreUserApprovalHandler();
userApprovalHandler.setApprovalStore(approvalStore());
userApprovalHandler.setClientDetailsService(clientDetailsService());
userApprovalHandler.setRequestFactory(requestFactory());
return userApprovalHandler;
}
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Bean
public DefaultOAuth2RequestFactory requestFactory(){
return new DefaultOAuth2RequestFactory(clientDetailsService());
}
@Bean
public ClientDetailsService clientDetailsService() {
return new JdbcClientDetailsService(dataSource);
}
@Bean
public ApprovalStore approvalStore() {
return new JdbcApprovalStore(dataSource);
}
@Bean
public TokenStore tokenStore() {
return new JdbcTokenStore(dataSource);
}
@Bean
public AuthorizationCodeServices authorizationCodeServices() {
return new JdbcAuthorizationCodeServices(dataSource);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
//endpoints.tokenStore(tokenStore());
// endpoints.approvalStore(approvalStore());
endpoints.userApprovalHandler(userApprovalHandler());
endpoints.authorizationCodeServices(authorizationCodeServices());
endpoints.authenticationManager(authenticationManager);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.jdbc(dataSource);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer authorizationServerSecurityConfigurer) throws Exception {
authorizationServerSecurityConfigurer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
}
}
authorize.html
Box" /> Read
972b85
.最后,您有几种选择.但是让我们来看看当前的项目状态.
authorize-endpoint(/ oauth / authorize)让用户决定是否授权或拒绝访问(通过显示表单).然后,UserApprovalHandler决定是否授予授权.
现有的UserAppovalHandler
实现需要不同的请求参数才能做出决策 – 这也意味着这会对/ oauth / authorize-view的外观产生影响.
选项1
custom / oauth / authorize-view包含< input name =“user_oauth_approval”value =“true”/>这需要UserApprovalHandler来获取所述参数以做出决定.使用DefaultUserApprovalHandler
(不记得任何决定)将起作用.这是配置的样子.在这种情况下,不需要Approval-Store.
只有在使用DefaultUserUserApprovalHandler时才会获取user_oauth_approval = true请求参数:
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Bean
UserApprovalHandler userApprovalHandler() {
return new DefaultUserApprovalHandler();
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
// ...
endpoints.userApprovalHandler(userApprovalHandler());
}
}
选项2
通过遵循选项1,但在这种情况下,通过提供自定义UserApprovalHandler来记住任何决策.
选项3
坚持使用ApprovalStoreUserApprovalHandler
(下面使用TokenStore)需要对表单进行一些调整:
Auth-Server-Config:
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Bean
public TokenStore tokenStore() {
return new JdbcTokenStore(dataSource);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
// ...
// registering an ApprovalStore automaticaly bootstraps `ApprovalStoreUserApprovalHandler`
endpoints.approvalStore(approvalStore());
}
}
选项N.
可能还有其他选择可能适合 – 但这取决于您的要求.