-
본 예제 프로젝트는 3가지의 인증 역할을 수행 할 수 있는 기능이 내장되어 있다. Springboot로 간단하게 구현.
- 소셜로그인 기능
- 2차인증 기능
- 토큰 Claim 추가 호출용 기능
- 카카오로 로그인, 네이버로 로그인 등과 같은 소셜로그인 기능에서 카카오 및 네이버 역할을 할 수 있도록 구현되어있다.
- Oauth2 Code Grant flow 참고
- hyperauth(keycloak)이 구동 되어 있어야 한다.
- application.properties 참고 변수 설정
- hyperauth url
- realm
- ExternalAuthController
- LoginController
- 로그인 과정 진행
- UserRepository에서 유저의 존재 여부만 판단하도록 구현
- Hyperauth의 broker endpoint로 redirect
- state, code 전달
- 원래 code는 랜덤 Gen 해야하지만 내부적으로 로그인을 진행중인 유저의 이메일 정보를 옮기기 위해 사용하게 끔 구현
- state, code 전달
- 로그인 과정 진행
- TokenController
- OAuth2 Token Endpoint 역할
- client secret 일치 여부 검사 (미구현)
- token json 발급
- 임시로 access_token 에 그냥 유저 이메일을 담음
- OAuth2 Token Endpoint 역할
- UserController
- OAuth2 Profile Endpoint 역할
- 토큰을 통해 유저의 정보를 넘겨줌
- OAuth2 Profile Endpoint 역할
- Hyperauth 구현 예시
- 코드 참조
- 변경 필요 포인트
- Provider ID, Name ....
- Hyperauth에 등록된 본 프로젝트의 Auth, Token, User Endpoint URL
- User Profile Json을 파싱하는 부분
- Hyperauth 등록 예시
- Initech 연동 아키텍쳐
- Hyperauth 로그인 화면에서 이메일(아이디) 만 입력한 후 인증을 Initech 화면에서 로그인을 거치면 최종 통과되도록 설계
- Hyperauth의 Authentication 이랑 연관
- ExternalAuthController
- 외부 인증 로그인 화면을 뿌려주는 역할
- session_code, tab_id, client_id를 Input으로 받아서 로그인 화면을 뿌려준다.
- templates/externalAuth.html 참조
- LoginController
- 로그인 과정 진행
- session_code, tab_id, client_id, execution 을 Query parameter로 hyperuath의 login-actions/authenticate Endpoint로 Redirect 함으로써, Hyperauth에서 대기중인 Authentication Flow가 계속 진행되도록한다.
- Hyperauth 등록 예시
- Hyperauth에서 특정 Client로 로그인시 토큰 Claim을 추가 발급하기 위해 외부 API를 호출하는 경우 사용
- ClaimController 참고
-
- 본 프로젝트는 HyperAuth 와 Initech SSO 로그인 시스템을 연동해주는 Proxy Server 로 동작하며, Initech SSO Login 시스템이 구축되어있어야 한다.
- HyperAuth Image b1.1.2.8 이후부터 연동 가능 (tmaxcloudck/hyperauth/b1.1.2.8)
external-oidc-provider.yaml 본 yaml 파일 적용하여 k8s에 배포
- Deployment env 추가
env: - name: SERVER_URL # 사용할 도메인명을 HTTPS와 함께 지정한다 value: "https://tmax.initech.com" - name: NLS_URL # Initech SSO Login 시스템의 Domain을 HTTPS와 함께 지정한다 value: "https://demo.initech.com" - name: NLS_PORT # Initech SSO Login의 Port를 작성해주어야 하는 경우 지정한다. (optional) value: "13443" - name: NLS_LOGIN_URN # Initech SSO Login 페이지 경로 value: "/nls3/clientLogin.jsp" - name: NLS_LOGOUT_URN # Initech SSO Logout 페이지 경로 value: "/nls3/NCLogout.jsp" - name: ND_URL1 # SSO 데몬 서버가 존재하는 경우 HTTPS와 함께 지정한다 (optional) value: "https://demo.initech.com:13443/rpc2" - name: ND_URL2 # SSO 데몬 서버가 이중화 되어있는 경우 HTTPS와 함께 지정한다 (optional) value: "https://ndtest.initech.com:5481" - name: SSO_DOMAIN # Initech SSO 시스템과 본 프로젝트의 공통 도메인을 지정한다 value: ".initech.com" # 신한라이프 전용 이메일 자동완성 기능 - name: AUTO_EMAIL_COMPLETION # true / false value: "true" - name: AUTO_EMAIL_FORMAT_PREFIX # email prefix value: "nl" - name: AUTO_EMAIL_FORMAT_SUFFIX # email suffix value: "@swing.shinhan.com"
- Certificate / Ingress 에 Domain 추가
spec: ingressClassName : tmax-cloud tls: - hosts: - tmax.initech.com # 본 프로젝트의 도메인 지정 secretName: external-oidc-provider-https-secret rules: - host: tmax.initech.com # 본 프로젝트의 도메인 지정 http: paths: - backend: serviceName: external-oidc-provider servicePort: 8080
... spec: secretName: external-oidc-provider-https-secret duration: 8760h # 360d=1y renewBefore: 720h # 30d isCA: false usages: - digital signature - key encipherment - server auth - client auth # ipAddresses: # - 192.168.9.12 dnsNames: - tmax.initech.com # 본 프로젝트의 도메인 지정 - tmax-cloud ...
- HyperAuth 설치
install-hyperauth
- Certificate / Ingress 에 Domain 추가