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

Java rest API身份验证,JWT的最佳实践,java,rest,jax-rs,Java,Rest,Jax Rs,我正在使用JAX-RS框架,为应用程序创建一个无休止的后端,我有一个资源,用于在用户登录时对其进行授权,以下是我的登录资源中的代码: @Path("authentication") public class AuthenticationRessource { private static Gson gson = new GsonBuilder().setPrettyPrinting().create(); private static AuthenticationFacade authent

我正在使用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();
}
}
现在,我有一个用于身份验证的资源,但这可能属于我的用户资源内部,我应该为每个用户(用户、超级用户、管理员等)分配一个用于身份验证的路径

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


当我添加令牌时,将授权添加到标头是否是最佳做法?

我将在前面解释,我根据JHipster生成器创建的应用程序对我的许多决策进行建模:

我没有从/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);
}
要解析JWT令牌,请执行以下操作:

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_头只是“AUTHORIZATION”:

publicstaticfinalstringauthorization\u HEADER=“AUTHORIZATION”


有一些我没有包括在这个回答中的缺失部分,您可能可以推断,但是如果您正在努力,我会鼓励您生成JHipster monolith应用程序,并亲眼看到JWT的一个良好实现,之后您可以对自己的实现进行建模。这是我在Java、Spring和Maven应用程序方面的一个帮助指南。

非常好,回答得很好!如何解析令牌,可以添加方法吗?如何验证令牌,可以附加方法吗?下面是一个JHipster应用程序示例。validateToken方法位于TokenProvider类中:
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;
}