Проверка подлинности Java rest API, лучшие практики с JWT - PullRequest
0 голосов
/ 13 ноября 2018

Я использую инфраструктуру 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();
}
}

сейчас у меня есть ресурс для аутентификации, но, возможно, он принадлежит моему пользовательскому ресурсу, и я должен назначить путь для аутентификации для каждого пользователя (пользователь, суперпользователь, администратор и т. Д.)

Должен ли я добавить аннотацию провайдера, для этого ресурса, будет ли это иметь значение?

Лучше ли добавлять AUTHORIZATION в заголовок при добавлении токена?

1 Ответ

0 голосов
/ 13 ноября 2018

Я предвосхищу это, объяснив, что я моделирую многие из моих решений из приложений, созданных генератором JHipster: https://www.jhipster.tech/security/

Вместо возврата AUTHORIZED или UNAUTHORIZED из конечной точки / authenticate я возвращаю 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 используется для определения, все еще ли пользователь AUTHENTICATED или UNAUTHENTICATED:

@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:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...