gpt4 book ai didi

java - 如何生成和访问 JWT key

转载 作者:行者123 更新时间:2023-12-01 17:58:36 25 4
gpt4 key购买 nike

我正在开发 REST API,并决定使用 JWT 进行身份验证/安全。有一个服务可以处理登录验证,还有一个过滤器可以绑定(bind)到每个需要身份验证的服务。

LoginService.java:

@Path("login")
public class LoginService {

private final static long EXPIRATION_TIME = 60000;

@POST
@Produces("application/json")
@Consumes("application/json")
public Response authenticateUser(Credentials c) {
Users login;
UsersDAO u = new UsersDAO();
try {
login = u.getAuthentication(c);

String token = generateToken(login.getIdUser(), login.getLogin(), login.getRole());

// Return the token on the response
return Response.ok().header(AUTHORIZATION, "Bearer " + token).build();
} catch (Exception e){
System.out.println("Exception: " + e.toString());
return Response.status(Response.Status.UNAUTHORIZED).build();
}
}

private String generateToken(int id, String login, int role) {
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);

//TODO generate key (or retrieve it from file/database?)
Key key;

String jwtToken = Jwts.builder()
.setSubject(login)
.setIssuer("my_company")
.setIssuedAt(now)
.setExpiration(new Date(nowMillis + EXPIRATION_TIME))
.claim("role", role)
.signWith(SignatureAlgorithm.HS512, key)
.compact();
return jwtToken;
}

JWTTokenFilter.java:

@Provider
@JWTTokenNeeded
@Priority(Priorities.AUTHENTICATION)
public class JWTTokenFilter implements ContainerRequestFilter {

@Override
public void filter(ContainerRequestContext requestContext) throws IOException {

String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);

String token = authorizationHeader.substring("Bearer".length()).trim();

try {
// TODO generate key (or retrieve it from file/database?)
Key key;
Jwts.parser().setSigningKey(key).parseClaimsJws(token);

} catch (Exception e) {
requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
}
}
}

我一直在做一些研究,但我仍然不确定如何管理 key 生成/验证。我的疑问:

  • 如果我在身份验证时创建 key ,我如何将相同的 key 传递给过滤器?我见过一些代码示例,其中在使用随机数进行身份验证和验证时都会生成 key ,这对我来说没有意义,因为生成的 key 不相同。我错过了什么?
  • 其他选项是将 key 存储在文件系统中,因此身份验证和验证进程都能够访问相同的 key 。这会给实现带来什么缺点(如果有)?有没有好的库或框架来管理文件系统(甚至数据库)中的 key 生成和访问?

请注意,我不想将 key 传递给客户端,因此他们必须偶尔进行身份验证才能刷新 token ,因为他们无法访问到期日期。 This主题不适合我的情况,并且 this相当完整,但没有提供任何示例

最佳答案

如果您在运行时生成对称 key ,您可以使用 spring 注入(inject)或使用静态变量在过滤器和登录类之间共享它

但请注意,重新启动服务器将使所有已发布的 JWT 失效。如果这不是所需的行为,您需要将 key 保留在属性文件或数据库中

使用 Jjwt,您可以执行以下操作:

//generate a random HMAC
Key key = MacProvider.generateKey(SignatureAlgorithm.HS256);

//Get the key data
byte keyData[]= key.getEncoded();
//Store data in a file...

//Build key
Key key = new SecretKeySpec(keyData, SignatureAlgorithm.HS256.getJcaName());

关于java - 如何生成和访问 JWT key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42690475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com