Django로 42API 로그인 구현하기

Yeshin Lee
5 min readDec 28, 2021

--

카카오나 구글 등 몇몇 소셜 사이트에서 자체 API를 제공하는 것처럼 42 도 API를 제공합니다. 이 전에는 JWT(JSON Web Token)를 사용했다면, 이번에는 OAuth2.0을 이용하여 로그인 기능을 구현해보았습니다. (Node.js로 구현하는 분들은 42passport 를 사용해보시길 추천해 드립니다.)

OAuth(Open Authorization)는 ‘제3의 애플리케이션이 서비스 사용자(자원의 소유자)를 대신하여 서비스를 요청할 수 있도록 자원 접근 권한은 위임하는 개방형 인증 프로토콜’입니다. 쉽게 말해 ‘한 사이트에서 Kakao, Google 등으로 로그인하기’를 생각하시면 됩니다.

  1. intra.42.fr 접속.
  2. 왼쪽 상단에 있는 settings -API -REGISTER A NEW APP 클릭.
  3. Name, Redirect URI (http://localhost) 입력.

4. 다음 항목(3개) 체크 - Submit

  • Website - Public
  • Scope - ‘Manage teams, slots and all projects related stuff’, ‘Manage user data’

그러면 다음과 같이 API가 생성됩니다.

UID와 SECRET, REDIRECT URI 이 3개가 중요합니다.

이제 원하는 값을 출력해보겠습니다.

  1. REDIRECT URI로 code를 받습니다. 위 사진에서 REDIRECT URI의 Try this url - Authorize 클릭하면 code를 확인할 수 있습니다.
code는 리다이렉트 된 주소 뒤에 붙어있고, URL을 파싱해서 가져오면 됩니다.
REDIRECT URI가 다르게 설정되어있다면, 위 에러를 발견할 수 있습니다.

2. request한 code를 받아 token을 DB에 POST 합니다. 이때 grant_type, UID, SECRET, redirect_uri를 추가로 입력해주어야 합니다. 저는 위 4개의 인자를 환경 변수화해서 사용했습니다.

환경 변수화할 때, UID라는 이름은 이미 존재하므로 다른 이름으로 지정해주어야 합니다.

3. token을 JSON으로 변환, access token으로 뽑아 DB에서 GET 합니다.

requests.post(‘token’, data=data)를 출력했을 때, 200이 나온다면 성공입니다.

4. GET으로 받아온 response를 다시 JSON으로 변환, 보낼 인자들을 dictionary로 return 합니다.

user_data = {
'id': info_to_json.get("id"),
'login': info_to_json.get("login"),
'email': info_to_json.get("email"),
'staff': info_to_json.get("staff?"),
'image_url': info_to_json.get("image_url")
}

JSON으로 변환하는 과정에서 JSONDecodeError 가 발생할 수 있습니다. (심지어 전날 제대로 동작했던 코드를 다음 날 돌려보았을 때 발생한 경우도 있었습니다.) 이 때, 코드에 오타가 없는지 제대로 확인하시길 바랍니다.(Stack Overflow를 참고해보았지만, 크게 도움 되지는 않았습니다.) 저의 경우, code 값이 존재하지 않을 때(request 전)의 처리를 하지 않아 발생했습니다. 그래도 안 된다면 IDE를 재시작하거나 재부팅을 추천해 드립니다.

또한 HTTP 상태 코드를 대략 기억하고 있다면, 3번의 결과를 보고 상태를 바로 파악할 수 있습니다.

reference

--

--