본문 바로가기
Developement/Toy Project

Flask로 가볍게 네이버 로그인 API 구현해보기

by 튼튼한개발자 2022. 4. 12.

요즘 구글, 페이스북, 네이버, 깃헙 등에서 제공하는 00으로 로그인하기 버튼을 본적이 꽤 있을 것이다.

이런 인증방식은 Oauth2.0이라고 부르며, 로그인의 표준으로 자리매김하고 있다.

 

다만 어디서 Client코드가, 어디서 Server 코드를 작성해야하는지 헷갈리는 경우가 있기 마련인데

Simple하게 구현해보기 위해서 Flask로 한번 구현해보자 (Flask를 해보진 않았어서, 한번 공부겸해서 구현해본다)

 

먼저 네이버로 로그인하기 API 명세이다.

https://developers.naver.com/docs/login/devguide/devguide.md#3-4-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%97%B0%EB%8F%99-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0

 

네이버 로그인 개발가이드 - LOGIN

네이버 로그인 개발가이드 1. 개요 4,200만 네이버 회원을 여러분의 사용자로! 네이버 회원이라면, 여러분의 사이트를 간편하게 이용할 수 있습니다. 전 국민 모두가 가지고 있는 네이버 아이디

developers.naver.com

 

개발가이드가 친절하게 되어있으며, 파라미터로 쓰이는 변수명도 카카오 로그인하기의 것과 같다ㅎㅎ

 

먼저 위와 같이 서비스URL과 Callback URL을 등록해보자.

개발용도로 쓸 것이므로, host는 localhost를 두면 되겠다. 

이렇게 해서 생성을 하게 되면, Client ID와 Client Secret이 생성된다.

 

Client ID와 Client Secret 모두 우리는 백엔드에서 감추고 쓰일 것이다.

 

import requests
from flask import Flask, redirect, request, jsonify

app = Flask(__name__)

@app.route("/naver") 
def NaverLogin():
    client_id = "클라이언트ID"
    redirect_uri = "http://localhost:8080/callback"
    url = f"https://nid.naver.com/oauth2.0/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code"
    return redirect(url)

@app.route("/callback")
def callback():
    params = request.args.to_dict()
    code = params.get("code")

    client_id = "클라이언트ID"
    client_secret = "클라이언트시크릿"
    redirect_uri = "http://localhost:8080/callback"

    token_request = requests.get(f"https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&client_id={client_id}&client_secret={client_secret}&code={code}")
    token_json = token_request.json()
    print(token_json)

    access_token = token_json.get("access_token")
    profile_request = requests.get("https://openapi.naver.com/v1/nid/me", headers={"Authorization" : f"Bearer {access_token}"},)
    profile_data = profile_request.json()

    print(profile_data)
    return "Done"
    
if __name__ == '__main__':
    app.run(debug=True, port=8080)

 

딱 필요한 것만 개발하였다.

 

1. 진입 포인트는 html이나 js에서 localhost:8080/naver를 호출할 것이고, 서버에서는 이를 301 redirect하여 네이버로그인 페이지로 보낼 것이다.

 

2. 네이버 로그인 페이지에서 로그인이 정상이라면 localhost:8080/callback?code={코드}로 요청이 갈 것이다.

 

3. 이때 우리는 이 query parameter인 code를 읽고, Client ID와 Client Secret와 함께 토큰을 요청한다.

 

4. 결과 값에서 acccess_token(접근 토큰)을 읽으면 이제 이 토큰은 유저에 대해 정보를 알 수 있는 토큰으로 쓸 수 있다. 만료기간도 json값 안에 있다.

 

5. 이 접근 토큰을 이용해서 마지막으로 프로필 API를 호출하면 profile_data에 유저가 허락한 정보가 있음을 알 수 있다.

'Developement > Toy Project' 카테고리의 다른 글

Python웹서버 - Fastapi 가볍게 두드려보기  (0) 2021.05.01

댓글