로그인 화면 생성

컴포넌트를 생성한다.

app.component.html에 로그인 링크를 추가한다.

로그인 화면을 만든다. 12칸중 4칸을 사용하는데 앞쪽에 offset을 4칸 주었다. 모바일 화면에서도 테스트해보자.

ngNativeValidate 를 줬기 때문에 html5 폼 validation 체크를 수행한다. id는 required와 email체크를 수행하고 password는 required 체크를 수행한다.

submit시에 콘솔에 찍기만 했다.

로그인 구현

로그인 로직을 구현한다. 먼저 /api/login 의 rest api 테스트를 수행한다.

입력으로 보낼 email, password를 저장할 member  vo 객체를 추가한다.

로그인 서비스를 구현한다.

login 컴포넌트에서 이 서비스를 호출하는 부분을 작성한다.

login은  http로 아이디/패스워드를 보내서 성공하면 서버에서 JWT 토큰을 생성해서 주는데, 이것을 스토리지에 저장한다. redirect_url이 의미하는것은 로그인후에 이동할 유알엘이다. 예를 들어,  만일 admin메뉴에 접속시 로그인 되어있지 않다면 블락킹되고 로그인 화면으로 이동할 것이다. 로그인을 성공하면 바로 이전에 접속할려고 했던 admin 화면으로 이동하게 된다. 없다면 초기화면으로 이동한다.

인증 서비스

login 이외 여러가지 인증 기능을 수행할 인증 서비스를 생성한다.

logout 함수와 isLogin 함수를 구현한다.

logout 은 스토리지에 저장된 토큰을 지운다.

isLogIn은 토큰 유효성을 검사해서 유효하면 true 그렇지 않으면 false를 리턴한다. 로그인이 되었다면 localStorage에 token이 저장되었을 것이다. 개발자도구에서 Application 탭에서 토큰 정보를 꺼내서 파싱테스트를 해보자.

JWT에 관한 자세한 사항은 아래 사이트를 참고하자.

https://jwt.io

body 부분을 파싱하면 다음과 같은 형태로 나와야 한다.

{jti“3”iat1545270813sub“”iss“admin@15.164.133.165”exp1545357213}

여기서 등록된 claim 인지 아닌지 RFC 7519 문서를 보고 파악해보자.

뷰 바인딩

뷰에서는 템플릿 드리븐폼으로 작성하고 바인딩한다.

이제 인증 테스트를 해보자. 로그인이 성공하면 홈화면으로 이동하는데, 먼가 아쉬운 부분이 보이는가?

그렇다. 로그인이 성공했는데, 아직도 상단 메뉴가 login으로 되어있다.  로그인이 성공하면 logOut으로 바꾸자.  컴포넌트에서인증 서비스를 public 접근자로 해놓으면 뷰에서 바로 접근이 가능하다.

Admin 모듈 인증

테스트 편의를 위해서 상단 메뉴에 admin 메뉴도 추가한다. 실제로 admin 메뉴를 노출하는것은 바람직하지 않다.

제일 먼저 auth-guard.service 에서 CanLoad 인터페이스를 implements한다.

그리고 라우팅 패스에 설정한다. 인증 서비스를 추가한다.

이제 admin 모듈로 진입하게 되면 AuthGuardService가 true를 리턴하면 진입이 가능하고 false를 리턴하면 진입할수 없고 로그인 화면으로 이동하게 된다.

로그인을 하지 않고 admin 모듈로 진입하게 되면 진입이 되지 않고 로그인화면으로 튕기는것을 알 수 있다. 로그인을 성공하면 redirect_url을 기억했기 때문에 직전 화면으로 이동하게 된다.