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

前端之家收集整理的这篇文章主要介绍了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

Box" /> Read
最佳答案
参考是提供的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)需要对表单进行一些调整:

Box:
    -->
    Box" /> OpenID

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相关文章