我使用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"
});
答案 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令牌。据我所知,从一种语言/框架到另一种语言/框架,其实现有所不同,这始终是通用过程。