对于一个学校项目,我尝试使用 JWT 令牌作为身份验证,当 JWT 令牌包含“教练”角色时,这意味着用户有权执行某些操作。
我编写了创建字符串的方法,以及应该对其进行解码的方法,但是当我将获取的字符串放入 Postman 时,我收到 500 内部服务器错误,因为根据 Postman 的说法,它不是有效的 Base64 编码字符串。 在 jwt.io 中,它解码没有任何问题...
我写的代码如下:
Algorithm algorithm = Algorithm.HMAC256("wisebite");
public String login() {
String jwtToken = JWT.create()
.withIssuer("wisebite")
.withSubject("wisebitedetails")
.withClaim("role", "coach")
.withIssuedAt(new Date())
.withExpiresAt(new Date(System.currentTimeMillis() + 5000L))
.withJWTId(UUID.randomUUID()
.toString())
.withNotBefore(new Date(System.currentTimeMillis() + 1000L))
.sign(algorithm);
return jwtToken;
}
public boolean hasAcces (String jwtToken) {
JWTVerifier jwtVerifier = JWT.require(algorithm).withIssuer("wisebite").build();
DecodedJWT decodedJWT = jwtVerifier.verify(jwtToken);
if (decodedJWT.getClaim("role").equals("coach")) {
return true;
} else {
return false;
}
}
是的,我知道,这不是登录的方式,因为没有检查任何内容,但我想先看看这段代码是否有效,所以当我在 Postman 中导航到 http://localhost:8080/coach/login 时,我收到了jwtToken:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ3aXNlYml0ZWRldGFpbHMiLCJyb2xlIjoiY29hY2giLCJuYmYiOjE3MDk3MTM3ODQsImlzcyI6Indpc2ViaXRlIiwiZXhwIjoxNzA5NzEzNzg4LCJpYXQiOjE3MDk3MTM3ODMsImp0aSI6ImY4Zjc3NzkxLTlmYjgtNDNlNi1iNTFjLTRlOTk1ZDQ2NGZmYyJ9.8sitspmE0N_Ai47qrIQmrp4szVc4mwDANlpN5L0jJbg
当我访问 http://localhost:8080/coach/overview/user 并将此 jwtToken 放入正文时,我收到错误消息说它不是 base64 编码的...
下面是@Getmapping
@GetMapping("/overview/{username}")
private ResponseEntity<PlanDTO> getPlanByClient(@PathVariable String username,
@RequestBody String jwtToken) {
if (authenticationService.hasAcces(jwtToken)) {
我使用的是 Auth0 库版本 4.2.1 我认为这就是我所掌握的所有信息,我做错了什么?
您可以采取以下几个步骤来排除故障:
确保您在 Postman 的授权标头中正确添加令牌。 仔细检查令牌中是否有多余的空格或字符。 确保您对请求使用正确的 HTTP 方法(GET、POST 等)。