Django로 42API 로그인 구현하기
카카오나 구글 등 몇몇 소셜 사이트에서 자체 API를 제공하는 것처럼 42 도 API를 제공합니다. 이 전에는 JWT(JSON Web Token)를 사용했다면, 이번에는 OAuth2.0을 이용하여 로그인 기능을 구현해보았습니다. (Node.js로 구현하는 분들은 42passport 를 사용해보시길 추천해 드립니다.)
OAuth(Open Authorization)는 ‘제3의 애플리케이션이 서비스 사용자(자원의 소유자)를 대신하여 서비스를 요청할 수 있도록 자원 접근 권한은 위임하는 개방형 인증 프로토콜’입니다. 쉽게 말해 ‘한 사이트에서 Kakao, Google 등으로 로그인하기’를 생각하시면 됩니다.
- intra.42.fr 접속.
- 왼쪽 상단에 있는
settings
-API
-REGISTER A NEW APP
클릭. - Name, Redirect URI (http://localhost) 입력.
- 8000번 포트에 연결했다면 http://localhost:8000/ 로 설정.
4. 다음 항목(3개) 체크 - Submit
- Website - Public
- Scope - ‘Manage teams, slots and all projects related stuff’, ‘Manage user data’
그러면 다음과 같이 API가 생성됩니다.
이제 원하는 값을 출력해보겠습니다.
- REDIRECT URI로 code를 받습니다. 위 사진에서 REDIRECT URI의
Try this url
-Authorize
클릭하면 code를 확인할 수 있습니다.
2. request한 code를 받아 token을 DB에 POST 합니다. 이때 grant_type
, UID
, SECRET
, redirect_uri
를 추가로 입력해주어야 합니다. 저는 위 4개의 인자를 환경 변수화해서 사용했습니다.
3. token을 JSON으로 변환, access token으로 뽑아 DB에서 GET 합니다.
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