gpt4 book ai didi

Java rest API 身份验证,JWT 最佳实践

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:09 28 4
gpt4 key购买 nike

我正在使用 JAX-RS 框架,为应用程序创建一个不安定的后端,并且我有一个资源,可以在用户登录时授权,这是到目前为止我在登录资源中的代码:

@Path("authentication")
public class AuthenticationRessource {


private static Gson gson = new GsonBuilder().setPrettyPrinting().create();
private static AuthenticationFacade authenticationFacade = new AuthenticationFacade();

@GET
@Path("login")
@Produces(APPLICATION_JSON)
public Response authenticateUser(@FormParam("email") String email, @FormParam("password") String password) {

try {
//skal måske ændres til bruger
User user = authenticationFacade.authenticateUser(email, password);

String token = authenticationFacade.generateAuthenticationToken(user);

return Response.ok().header(AUTHORIZATION, "Bearer " + token).build();

} catch (Exception e) {
Response.status(Response.Status.UNAUTHORIZED).build();
System.err.print("det fuckede op, på grund af Thomas har ødelagt koden");
e.printStackTrace();
}
return Response.status(Response.Status.UNAUTHORIZED).build();
}
}

现在我有一个用于身份验证的资源,但也许这属于我的用户资源,我应该分配一个路径,用于为每个用户(用户、 super 用户、管理员等)进行身份验证

我是否应该为此资源添加一个提供者注释,这会有什么不同吗?

当我添加 token 时,将 AUTHORIZATION 添加到 header 是最佳做法吗?

最佳答案

我将通过解释我对 JHipster 生成器创建的应用程序的许多决策进行建模来作为序言:https://www.jhipster.tech/security/

我没有从/authenticate 端点返回 AUTHORIZED 或 UNAUTHORIZED,而是返回了 JWT。/authenticate 端点在登录步骤中被命中,JWT 被保存。请参阅以下示例:

@PostMapping("/authenticate")
@Timed
public ResponseEntity<JWTToken> authorize(@Valid @RequestBody LoginVM loginVM) {

UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(loginVM.getUsername(), loginVM.getPassword());

Authentication authentication = this.authenticationManager.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe();
String jwt = tokenProvider.createToken(authentication, rememberMe);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);
return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK);
}

然后,我可以在任何时候使用 API 端点来通过过滤器运行存储的 token ,以确定用户是否仍处于已验证状态或未验证状态:

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String jwt = resolveToken(httpServletRequest);
if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) {
Authentication authentication = this.tokenProvider.getAuthentication(jwt);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(servletRequest, servletResponse);
}

并解析 JWT token :

private String resolveToken(HttpServletRequest request){
String bearerToken = request.getHeader(AUTHORIZATION_HEADER);
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7, bearerToken.length());
}
return null;
}

AUTHORIZATION_HEADER 就是“授权”:

public static final String AUTHORIZATION_HEADER = "Authorization";

有一些我没有包含在这个回复中的遗漏部分,你可能可以推断出,但如果你正在努力,我会鼓励你生成一个 JHipster 单体应用程序,并亲眼看到一个很好的 JWT 实现,你可以为你的模型建模自己实现后。这是我在 Java、Spring、Maven 应用程序方面寻求帮助的首选之一。

关于Java rest API 身份验证,JWT 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53287553/

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