如何在具有JWT令牌的Spring的安全端点的GET请求中包括授权标头

时间:2020-02-10 18:53:20

标签: java spring-boot spring-security jwt

我使用Spring-Security和JWT库生成令牌。当用户通过身份验证后,我将获得授权令牌作为响应:

Authorization: Bearer eyJhbGciOiJIUzUxMiJ...

在所有教程中,我都看到作者在使用POSTMAN发送GET请求时将此令牌粘贴在授权标头中,但是没有教程在实际请求中如何工作。尽管在邮递员中,当我粘贴标题时,它可以正常工作,并且我得到200的确认。

我想知道如何在真实代码中包含此标头?

public class JwtUsernameAndPasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    private final AuthenticationManager authenticationManager;
    private final JwtConfig jwtConfig;
    private final SecretKey secretKey;


    public JwtUsernameAndPasswordAuthenticationFilter(
            AuthenticationManager authenticationManager, 
            JwtConfig jwtConfig,
            SecretKey secretKey) {

        this.authenticationManager = authenticationManager;
        this.jwtConfig = jwtConfig;
        this.secretKey = secretKey;
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, 
            HttpServletResponse response) throws AuthenticationException { 

        try {       
        System.out.println("Authentication token " + request.getInputStream());
        UsernameAndPasswordAuthenticationRequest authenticationRequest = 
                new ObjectMapper().readValue(request.getInputStream(), 
                UsernameAndPasswordAuthenticationRequest.class);


        Authentication authentication = new UsernamePasswordAuthenticationToken(
                authenticationRequest.getUsername(), 
                authenticationRequest.getPassword()
        );



        SecurityContextHolder.getContext().setAuthentication(authentication);

        Authentication authenticate = authenticationManager.authenticate(authentication);
        return authenticate;

        } catch(IOException e) {
            throw new RuntimeException("new runtime exception " + e);
        }

    }


    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, 
            FilterChain chain, Authentication authResult) throws IOException, ServletException {

        String token = Jwts.builder()
            .setSubject(authResult.getName())
            .claim("authorities", authResult.getAuthorities())
            .setIssuedAt(new Date())
            .setExpiration(java.sql.Date.valueOf(LocalDate.now().plusDays(jwtConfig.getTokenExpirationAfterDays())))
            .signWith(secretKey)
            .compact();

       System.out.println("This is token: " + token);   
       response.addHeader(jwtConfig.getAuthorizationHeader(), jwtConfig.getTokenPrefix() + token);

    } 





}

编辑

这是我的前端请求。调用之后,我获得带有授权令牌的Response标头。现在的问题是,如何使用此令牌实现将来的请求? :

$.ajax({
                      type: 'POST',
                      url: "/login",
                      data: JSON.stringify({
                          "username" : "linda",
                          "password" : "password",

                      }),
                      success: function(response) {
                         // some logic
                         },

                      error: function(e) {
                        console.log(e);
                      },
                      processData: false,
                      //dataType: "json",
                      contentType: "application/json; charset=utf-8"
                    });

2 个答案:

答案 0 :(得分:1)

我建议使用诸如angular或react之类的单页框架,因为它们提供了更好的工具。但是,您使用的框架完全取决于您的应用程序。对于JQuery和javascript,您可以使用以下代码:
您必须将令牌存储在浏览器中。一种方法是使用“本地存储”:

  success: function(response) {
    // not sure how you send token
    localStorage.setItem('token', response.token)
  },

,然后将令牌头添加到ajax请求中。请注意,您必须在代码中处理空令牌或过期令牌。

token = localStorage.getItem('token')
$.ajaxSetup({
  headers: { Authorization: 'Bearer ' + token }
})
//call ajax

答案 1 :(得分:1)

用户通过身份验证后,您想使用本地存储或会话存储将返回的令牌存储在客户端。接下来,您将保护需要所述令牌的任何路由/端点(受保护的路由)。应该有一个授权保护装置,用于检查标头中是否存在令牌(与通过邮递员发送请求时使用的格式相同)。如果令牌无效或完全不在标题中,则令牌通常会重定向到其他路由(通常是登录页面)。

这不是特定于Spring,而是特定于JSON Web令牌。据我所知,从一种语言/框架到另一种语言/框架,其实现有所不同,这始终是通用过程。