加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 01:08:29 所属栏目:Java 来源:网络整理
导读:我使用Spring集成的Oauth2创建了一个应用程序.我有自己的自定义登录和授权模板.成功通过身份验证后,它会重定向到授权.html,要求用户批准.问题是当我点击甚至批准或拒绝按钮操作总是拒绝,如下表所示 另外,我们如何使用oauth2启用基于REST的身份验证和授权.我

我使用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.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读