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

如何使用JWT令牌在Spring中向安全endpoint的GET请求中包含授权标头

殷承恩
2023-03-14

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

Authorization: Bearer eyJhbGciOiJIUzUxMiJ...

在所有教程中,我都看到作者在使用POSTMAN发送GET请求时将此令牌粘贴在授权标头中,但没有教程说明它如何在实际请求中工作。尽管在我的邮递员中,当我粘贴标题时,它是有效的,我得到了200个OK。

我想知道如何在真正的代码中包含这个标题?

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);

    } 





}

编辑

这是我的前端请求。在这个调用之后,我得到带有授权令牌的响应头。现在的问题是我如何使用这个令牌来实现未来的请求?:

$.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个答案

翟单弓
2023-03-14

我建议使用单页框架,如角或反应,因为提供更好的工具。但是你使用的框架完全取决于你的应用程序。对于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
汝楷
2023-03-14

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

这不是针对Spring的,而是针对JSON Web Tokens的。实现从一种语言/框架到另一种语言/框架不同,据我所知,这总是一般的过程。

 类似资料:
  • 我正在努力构建两个asp.netmvc web应用程序之间的安全集成;和调用网络扫描应用程序的ERP系统。所以目前在接收器应用程序(网络扫描应用程序)上我有以下操作方法,应该只由ERP系统执行:- 而在调用者系统(ERP系统)上,我有以下调用上述动作方法的动作方法。 如上面代码所示,我正在发送一个安全令牌,它存储在两个应用程序的web中。配置文件。通过这种方式,我可以确保(或者这是我的意图)网络扫

  • 寻求有关如何进行微服务授权的建议。 我使用spring/spring boot来提供所有的微服务 在使用JWT令牌到达实际微服务之前,我可以通过Spring Cloud网关进行身份验证,但是在授权方面,我不确定如何做到这一点。 我想在内部处理business microservice中每个endpoint的授权。 有没有办法将JWT令牌传递给微服务,或者我需要调用authserver来获取用户中的

  • 我有一个Web api终端,它给我JWT令牌。它不是一个完全授权的服务器。它只是可以生成一个JWT令牌。 现在我有另一个用 aspnet 核心编写的 Web 应用程序。其中在启动中.cs我添加了以下行,以便我可以使用收到的 JWT 令牌进行授权 我也有一个登录表单(在web应用程序中),用户输入用户名和密码,我发送到web api并获得令牌。为了保护web应用程序中的任何控制器,我只使用了[Aut

  • 我使用Localstack和Test容器((test容器: localstack: 1.15.2))进行集成测试,并在测试设置中设置秘密,如下所示:代码示例 现在,测试因错误而崩溃: com.amazonaws.services.secretsmanager.model.AWSSecretsManagerException:请求中包含的安全令牌无效。(服务:AWSSecuresManager;状态

  • 我是新来的AWS和我试图执行CRUD操作本地DynamoDB从一个Java程序。Java程序是一个AWS示例。 我安装了AWS CLI并设置了以下配置-根据AWS文档,我不需要本地DynamoDB的真正AWS访问和密钥。 我在~/中设置了以下值。aws/config和~/。通过在aws CLI中运行aws configure获得aws/credentials。 我有本地DYnamoDB JAR与此

  • 我正在尝试使用JWT身份验证设置一个简单的Angularjs应用程序。 我给新注册的用户发了一封带有jwt令牌链接的邮件,以验证该邮件是否存在。链接如下所示: < code > http://127 . 0 . 0 . 1:3000/verify email/eyj 0 exaioijkv 1 qilchbgcioijiuzi 1 nij 9 . eyj 1c 2 vytmftzsi 6 injp