jwt 토큰 개발 중,
나는 정상적으로 로그인을 했으나
헤더에 Authorization 이 뜨지 않는 현상이 발생했다
그리고 권한이 url로 가면
403 에러(권한 없음)가 뜬다....
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
System.out.println("successfulAuthentication 실행 됐으니 로그인 인증이 완료됐네요");
// authResult 객체로 jwt 토큰을 만들자 !
PrincipalDetails principalDetails = (PrincipalDetails) authResult.getPrincipal();
// java-jwt 라이브러리로 만들어 보자 !
// RSA 방식 X
// Hash 암호 방식
String jwtToken = JWT.create()
// 토큰이름?
.withSubject("cos")
// 토큰 만료 시간 10분
.withExpiresAt(new Date(System.currentTimeMillis() + (60000 * 10)))
//비공개 클레임 넣고싶은 키 밸류값 넣을 수 있음
.withClaim("id", principalDetails.getUser().getId())
// .withClaim("username", principalDetails.getUser().getUsername()) //굳이?
.sign(Algorithm.HMAC512("cos(sign)"));
response.addHeader("Authorization", "Bearer"+jwtToken);
// response.addHeader("\"Access-Control-Expose-Headers\"", "Authorization");
System.out.println("헤더에 추가 완료");
System.out.println("Bearer"+jwtToken);
super.successfulAuthentication(request, response, chain, authResult);
}
분명히 토큰을 만들어서 response 헤더에 넣었는데도 안 뜸...
그래서 jwt 토큰 생성 후 동작하는 필터에서 헤더를 꺼내보니
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
System.out.println("필터1");
HttpServletResponse response1 = (HttpServletResponse) response;
String header = response1.getHeader("Authorization");
System.out.println("header = " + header);
filterChain.doFilter(request, response);
}
null 값이 뜬다....ㅡ.ㅡ
디버깅해보니
response 에는 헤더 값이 들어가있는 거 같담..
addHeader () 이후 저 값이 추가됨
계속 coyoteresponse 보면서
authorization 있는지 확인했는데
이상하게 필터1만 가면 헤더가 사라져있음...ㅎㅎ
일단 이걸 찾았음...
UserDetails 구현 클래스에서
authrities 만들어놓고
null 값 리턴하게 해놨더라....^^
일단 이걸 authrities를 리턴하게 수정했다
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> authorities = new ArrayList<>();
user.getRoleList().forEach(r -> {
authorities.add(() -> r);
});
return authorities;
}
하지만 여전히 헤더에는 토큰 값이 들어오지 않았다....
디버깅을해도..
문제가 없어보였다....
그런데...
jwt 토큰을 생성하고 헤더에 추가를 해놓는 로직을 열심히 작성해놓고
마지막에
super 변수로 오버라이딩 안 한,
원래의 UsernamePasswordAuthenticationFilter 가 가지고 있던
successfulAuthentication 필터를 다시 한 번 동작시킨 것이었다....ㅎㅎ^^11
하...
부모 메서드를 호출하는 문장을 치우고 나니
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
System.out.println("successfulAuthentication 실행 됐으니 로그인 인증이 완료됐네요");
// authResult 객체로 jwt 토큰을 만들자 !
PrincipalDetails principalDetails = (PrincipalDetails) authResult.getPrincipal();
// java-jwt 라이브러리로 만들어 보자 !
// RSA 방식 X
// Hash 암호 방식
String jwtToken = JWT.create()
// 토큰이름?
.withSubject("cos")
// 토큰 만료 시간 10분
.withExpiresAt(new Date(System.currentTimeMillis() + (60000 * 10)))
//비공개 클레임 넣고싶은 키 밸류값 넣을 수 있음
.withClaim("id", principalDetails.getUser().getId())
.withClaim("username", principalDetails.getUser().getUsername()) //굳이?
.sign(Algorithm.HMAC512("cos(sign)"));
response.addHeader("Authorization", "Bearer"+jwtToken);
// response.addHeader("\"Access-Control-Expose-Headers\"", "Authorization");
System.out.println("헤더에 추가 완료");
System.out.println("Bearer"+jwtToken);
}
제대로 authorization 헤더에 토큰이 들어가는 것을 알 수 있다 ^^
하......................
오늘의 교훈
: 오버라이드 메소드를 단축키로 불러올 땐,
super 변수를 확인하고 지워주자....