42Seoul-LastDance / Backend

2 stars 0 forks source link

[Feature] Authentication & Authorization, OAuth #10

Closed Tolerblanc closed 1 year ago

Tolerblanc commented 1 year ago

요약


내용

TODO



참고자료

  1. 42 api 에서 user 정보 불러와서 저장하기 [구현]
  2. jwt 토큰 발급하기 [인증과 인가 개념, 세션과 jwt, 쿠키 개념, @nestjs/jwt 모듈 사용법]
  3. Guard, Strategy 작성해서 인증된 유저 구분해서 각 Controller 접근 엑세스 관리하기



Tolerblanc commented 1 year ago

IMG_177C01D45C4D-1 은정님께서 정리해주신 로그인 플로우 입니다

Tolerblanc commented 1 year ago

CORS 에러를 해결할 방법이 하나 생각난 것 같아서 이슈를 다시 엽니다. 예전에 은정님께서 한 번 이야기 해주신 방법인 것 같기도 합니다? 현재는 42로그인 버튼을 눌렀을 때 프론트->백->42 인증서버->(42로그인 창 html : 프론트) 플로우여서, 백에서 던진 요청이 프론트로 도착하기 때문에 CORS가 나고 있는데, 프론트 측에서 42 인증서버로 직접 요청하고 결과로 날라오는 토큰만 백으로 전달하면 될 것 같습니다. 해당 토큰에 대한 유효성 검사는 https://api.intra.42.fr/oauth/token/info로 요청을 보내면 가능합니다!

다만 광식님께서 다른 트센 레포들을 봤을 때, 대부분 팀에서 이 문제를 리다이렉트로 해결하고 있기도 하고, 현재는 밀린 일이 많기 때문에 나중에 다시 와서 보면 좋을 것 같습니다.

JaeJunday commented 1 year ago

10/10

origin/feature/socket : commit cfa6f3dd375e4b0df72a71984b5d48d1e2deca2c

에서 cors 브랜치로 분기해서 인증부분 구현해보겠습니다.

JaeJunday commented 1 year ago

이것저것 찾아보고 있는데 프론트에서 토큰 발급받는거 자체가 탈취당할 위험이 높다고 합니다. 우리가 인증을 진행하는 api 엔드 포인트에서 토큰이 탈취 당했다고 가정해봤을때 토큰을 다시 백엔드로 보내서 토큰이 유효한지 검사하는게 의미가 없을 것 같습니다.

Tolerblanc commented 1 year ago
  1. 로그인 페이지에서 42로그인 버튼을 눌렀을 때, 프론트에서 https://api.intra.42.fr/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri} 로 직접 axios.get 요청
  2. 넘어온 42로그인 html페이지에서 유저가 로그인 후 Authorize. axios.get에 대한 요청으로 42 인증 서버에서 code 파라미터 응답
  3. 받은 code를 프론트에서 백으로 login/42login (엔드 포인트 이름은 임시입니다) 로 axios.get 요청
  4. 백에서는 넘겨받은 code를 가지고 https://api.intra.42.fr/oauth/token로 Body에 grant_type=authorization_code&client_id={client_id}&client_secret={client_secret}&code={code} 를 담아 axios.post 요청
  5. 4번 요청의 결과로 42 인증 서버로부터 42 access_token 발급
  6. 5번에서 받은 토큰으로 https://api.intra.42.fr/v2/me 를 통해 유저 회원가입
  7. JWT 발급

만약 refresh_token을 가지고 있었다면, 1번에서 42로그인을 눌렀을 때, axios.get 요청이 아닌 백엔드의 regenerateJwt 엔트포인트로 요청 주시면 될 것 같습니다. 로직의 허점을 찾아보아요!

SikPang commented 1 year ago

이거 됐나요? 3~4번에서 CORS 안 떠요?

OZestina commented 1 year ago

1~2번부터 터져서 이 방법은 제외되었습니다 👯