当前位置: 首页 > 知识库问答 >
问题:

如何使用ReactJs向Spring Security提交jwt令牌?

穆嘉
2023-03-14

我已经用Spring Security保护了Spring Boot应用程序的APIendpoint。

登录时,我生成一个新的jwt令牌并将其提交给用户。

对于数据请求,我希望用户在头中提交令牌。

如果我这样做使用邮递员,它的工作完美罚款。当我试图用React发送令牌时,它失败了(axios/finch/超级代理)。问题不在于令牌本身的提交,因为如果我禁用授权,我可以用控制器读取授权头。

相反,Spring Security在通过React发送标头时不知何故无法识别标头。

我尝试添加另一个自定义标题,看看Spring是否允许这样做,但该自定义标题也被“阻止”。

反应:

axios(apiTest, {
      async: true,
      crossDomain: true,
      method: "GET",
      headers: {
        Authorization: `Bearer ${this.props.token}`,
        TestHeader: "RandomValue",
        Accept: "*/*"
      },
      processData: false,
      data: ""
    })
      .then(res => {
        if (res.data !== undefined) {
          console.log(res.data);
        }
      })
      .catch(err => console.error(error));

Spring Security:令牌过滤器:

@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {

    @Value("${jwt.header}")
    private String tokenHeader;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
                //Usual Authorization header (is null with React-use)
                final String requestHeader = request.getHeader(this.tokenHeader);
                //Custom header (null)
                System.out.println("Test Header: " + request.getHeader("TestHeader"));
        if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
            String authToken = requestHeader.substring(7);
            JwtAuthentication authentication = new JwtAuthentication(authToken);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
        chain.doFilter(request, response);

    }
}

配置:


    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationEntryPoint unauthorizedHandler;

    @Autowired
    private JwtAuthenticationProvider jwtAuthenticationProvider;

    @Autowired
    public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) {
                authenticationManagerBuilder.authenticationProvider(jwtAuthenticationProvider);
    }

    @Bean
    CorsFilter corsFilter() {
        CorsFilter filter = new CorsFilter();
        return filter;
    }

    @Bean
    public JwtAuthenticationTokenFilter authenticationTokenFilterBean() {
        return new JwtAuthenticationTokenFilter();
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.addFilterBefore(corsFilter(), SessionManagementFilter.class).csrf().disable().authorizeRequests()
                .antMatchers("/Login").permitAll().antMatchers("/CloseConnection**").permitAll()
                .antMatchers(HttpMethod.OPTIONS, "**").permitAll().anyRequest().authenticated().and()
                .exceptionHandling().authenticationEntryPoint(unauthorizedHandler);
    }
}

知道确切的问题是什么以及如何解决吗?

共有1个答案

洪经义
2023-03-14

试试这个它对我有用

   private String getToken(HttpServletRequest request) {
            String header = request.getHeader("Authorization");     
            if (header != null && header.startsWith("Bearer ")) {
                return authHeader.replace("Bearer ","");
            }

            return null;
        }

axios呼叫

axios.post(url,{
     "data": 'sample',
    },
    {
      headers: {
      'Authorization':'Bearer '+token,
      'Content-Type':'application/json'
      }
    })
    .then((res) => {
      console.log(res);
    })
 类似资料:
  • 我们希望使用SpringOAuth2JWT令牌支持。我们的架构如下:Spring只提供了一个REST接口,前端由AngularJS构建,AngularJS查询Spring REST接口。出于授权目的,我们的前端团队希望使用JWT。因此,我查看了SpringOAuth2JWT支持,但仍然不知道如何与前端讨论JWT令牌。在阅读了一些教程后,我实现了以下内容: 我不确定工作流程如何。我猜:前端访问/oa

  • 问题内容: 我们的React Native Redux应用程序使用JWT令牌进行身份验证。有许多操作需要此类令牌,​​并且例如在应用加载时会同时分派许多令牌。 例如 双方并要求JWT。我们将令牌保存在和中。我的问题是如何处理令牌到期。 最初,我将使用中间件来处理令牌到期 } 我遇到的问题是,对于令牌和操作,都会刷新令牌,因为在分发令牌和令牌时,令牌将过期。理想情况下,我想“暂停”需要身份验证的操作

  • 我遇到的问题是,和操作都将刷新令牌,因为在分派时,令牌将过期。理想情况下,我希望“暂停”需要身份验证的操作,直到令牌刷新。有没有一种方法可以用中间件做到这一点?

  • 问题内容: 我正在使用dgrijalva / jwt-go /软件包。 我想从令牌中提取有效载荷,但是我找不到方法。 示例(摘自:https : //jwt.io/): 对于编码: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOixMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydhV​​rF7H

  • 我有一个ReactJS项目,当我登录时,我将我的令牌保存到本地存储。如何将令牌JWT转换为ab对象并获取id-user?

  • 我使用jwt为用户在我的应用程序上执行操作提供授权。它工作得很好,因为我不必访问数据库来查看用户是否有效。我在jwt中遇到的问题是,当令牌过期时,用户必须再次登录。在网上阅读我一直在阅读刷新令牌可以用来解决这个问题,但没有白痴证明解释它如何工作。它们是如何工作的?需要数据库访问吗?