Java API de autenticación de reposo, las mejores prácticas con JWT

baileyhaldwin:

Estoy usando el marco JAX-RS, para hacer un back-end inquieto para una aplicación, y tengo un recurso, autorizar, usuario, cuando conecta, y aquí es mi código en mi recurso de inicio de sesión hasta el momento:

@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();
}
}

en este momento tengo un recurso para la autenticación, pero tal vez esto pertenece interior de mi recurso de usuario, y que debería asignar una ruta, para la autenticación para cada usuario (usuario, superusuario, administrador, etc.)

¿Debo agregar una anotación de proveedor, para este recurso, habría que hacer una diferencia?

¿Es la mejor práctica para agregar autorización a la cabecera, cuando agrego el token?

Derek:

Voy a incondicional esto explicando que modelar muchos de mis decisiones fuera de las aplicaciones creadas por el generador JHipster: https://www.jhipster.tech/security/

En lugar de devolver autorizado o no autorizado de la / autenticar punto final, vuelvo la JWT. El criterio de valoración / autenticar es golpeado durante la etapa de inicio de sesión y la JWT se guarda. Véase el siguiente ejemplo:

@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);
}

I continuación, puede ejecutar el token almacenado a través de un filtro cualquier momento un punto final API se utiliza para determinar si el usuario sigue siendo autenticado o no autenticado:

@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);
}

Y para resolver el 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;
}

El AUTHORIZATION_HEADER es simplemente "Autorización":

public static final String AUTHORIZATION_HEADER = "Authorization";

Hay algunas piezas que faltan No incluirán en esta respuesta que es probable que pueda inferir, pero si usted está luchando les animo para generar una aplicación monolito JHipster y conocer de primera mano una implementación bien de JWT que se puede modelar su propia implementación después . Esta es una de mis go-tos de ayuda con las aplicaciones Java, Spring, Maven.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=212279&siteId=1
Recomendado
Clasificación