자바 나머지 API 인증, JWT와 모범 사례

baileyhaldwin :

내 로그인 자원에 내 코드는 지금까지 여기 나는 응용 프로그램에 대한 불안 백엔드을하려면 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 발생기에 의해 생성 된 응용 프로그램으로 내 의사 결정의 많은 모델 있음을 설명하여이 서문합니다 https://www.jhipster.tech/security/

대신 공인 반환 또는 권한이없는은 / 인증하고 엔드 포인트, 나는 JWT를 반환합니다. 은 / 인증합니다 엔드 포인트는 로그인 단계에서 공격하고 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 엔드 포인트는 사용자가 아직 인증을 거치지 않거나 인증되지 않은 여부를 확인하는 데 사용되는 모든 시간을 저장 토큰을 실행할 수 있습니다 :

@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의 좋은 구현을 참조하시기 바랍니다 할 수있는이 응답에 포함되지 않은 일부 누락 된 부분이있다 . 이것은 자바, 봄, 메이븐 응용 프로그램에 대한 도움말 내 이동-TOS 중 하나입니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=212274&siteId=1