java – OAuth2:确认批准不起作用,即使单击“批准”按钮也会拒绝

我使用Spring集成的Oauth2创建了一个应用程序.我有自己的自定义登录和授权模板.成功通过身份验证后,它会重定向到授权.html,要求用户批准.问题是当我点击甚至批准或拒绝按钮操作总是拒绝,如下表所示

enter image description here

另外,我们如何使用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

最佳答案
参考是提供的project,git-commit 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.

可能还有其他选择可能适合 – 但这取决于您的要求.

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...