2์ฐจ ํ๋ก์ ํธ๋ฅผ ์ํด flask
์์ ๋ค์ํ ์์
๋ก๊ทธ์ธ์ ๊ตฌํํด๋ดค๋ค.
oauth
์ ๋ํ ๊ฐ๋
์ ์ ๋๋ก ์ก๊ณ ๊ตฌํํด๋ณด๋ ์๋น์ค ์ข
๋ฅ์ ๊ด๊ณ์์ด ๊ณต์๋ฌธ์๋ง ๋ณด๊ณ ๊ตฌํ ๊ฐ๋ฅํ๋ค. (๋ฟ๋ฏ)
์นด์นด์ค, ๋ค์ด๋ฒ, ํ์ด์ค๋ถ, ๊ตฌ๊ธ์ ๋๋ฅผ 2์ฐจ ํ๋ก์ ํธ์ ์ ์ฉ์์ผ ๋ณผ ์๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ฏธ๋ฆฌ ๊ตฌํํด ๋ณผ ์์ ์ด๋ค. ์ฐ์ ์นด์นด์ค์ ๋ค์ด๋ฒ ๋จผ์ ๊ตฌํํด๋ดค๋ค.
๊ตฌํ์ ์์ API๋ฅผ ์ฌ์ฉํ๋ฉด์ Github์ ์ด์ฉํ๋ ค๋ฉด ํค ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค. ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง ๋ด๊ฐ ์ฐพ์ ๊ฒ์ python-decouple
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
pip install python-decouple
setting.ini์ key ์ ์
key=value
ํํ๋ก ์ ์ํ๋ค.
[settings]
KAKAO_REST_API=MY_KEY
NAVER_CLIENT=MY_KEY
NAVER_CLIENT_SECRET=MY_KEY
์ ์ํ ํค ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
์ฐ์ decouple ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ config ๋ฉ์๋๋ฅผ import ํ๋ค.
from decouple import config
๊ฐ์ ธ์ค๋ ๊ฒ์ ์์ฃผ ๊ฐ๋จํ๋ค.
client_id = config("KAKAO_REST_API")
ํ๋ฆ์ ๋์ผํ๋ค.
redirect_uri
๋ฅผ ๋ฐ๋์ ์ค์ ํด์ค์ผ ํ๋ค. ํด๋น redirect_uri
๋ก ์์ธ์ค ํ ํฐ
์ ๋ฐ์ ์ ์๋ ์ธ์ฆ์ฝ๋
๋ฅผ ์๋ตํด์ค๋ค.์ธ์ฆ์ฝ๋
๋ฅผ ๋ฐ์ผ๋ฉด ํด๋น ์ฝ๋๋ก ์์ธ์ค ํ ํฐ
์ ์์ฒญํ๋ค.์์ธ์ค ํ ํฐ
์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด
๋ฅผ ์์ฒญํ๋ค. from flask import redirect, request, jsonify, Blueprint
import requests
from decouple import config
bp = Blueprint("kakao_login", __name__, url_prefix='/')
kakao_client_key = config('KAKAO_REST_API')
redirect_uri = "http://localhost:5000/oauth/kakao/callback"
# ์ฌ์ฉ์๊ฐ ์นด์นด์ค ๋ก๊ทธ์ธ ์์ฒญ์ ์นด์นด์ค ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋
# ์ฌ์ฉ์๊ฐ ์นด์นด์ค์ ์ธ์ฆ ์ฑ๊ณต์ ์ง์ ํ Redirect_URI๋ก Access_token์ ์์ฒญํ ์ ์๋ ์ธ์ฆํ ํฐ(Authentication_code)๋ฅผ ์๋ต๋ฐ๋๋ค.
@bp.route('/oauth/kakao')
def redirect_kakao_login_page():
kakao_redirect_url = f"https://kauth.kakao.com/oauth/authorize?client_id={kakao_client_key}&redirect_uri={redirect_uri}&response_type=code"
return redirect(kakao_redirect_url)
# ์ธ์ฆํ ํฐ์ ์๋ต๋ฐ๊ณ ์๋ต๋ฐ์ ์ธ์ฆํ ํฐ์ผ๋ก Access_token์ ์์ฒญํ ํ ์๋ต๋ฐ์ Access_token์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ฒญ
@bp.route('/oauth/kakao/callback')
def access():
code = request.args.get('code')
access_token_request_url = f"https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id={kakao_client_key}&redirect_uri={redirect_uri}&code={code}"
response_token = requests.get(access_token_request_url).json()
token = response_token['access_token']
user_info_request_url="https://kapi.kakao.com/v2/user/me"
user_info = requests.get(user_info_request_url, headers={"Authorization":f"Bearer {token}"})
return jsonify(user_info.json())
์ด์ ์ ๋ฌ๋ฐ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ๋นํ๊ฒ DB์ ์ ์ฅํ๊ณ jwt
๋ฑ์ ์ด์ฉํด์ ํ์ฌ ์ฌ์ฉ์์ ์ธ์ฆ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
๊ฑฐ์ ์์ ํ ๋์ผํ๋ค..
from flask import Blueprint, request, jsonify, redirect
import requests
from decouple import config
bp = Blueprint("naver_login", __name__, url_prefix="/")
client_id = config("NAVER_CLIENT")
client_secret = config("NAVER_CLIENT_SECRET")
redirect_uri = "http://localhost:5000/oauth/naver/callback"
# localhost:5000/oauth/naver
@bp.route("/oauth/naver")
def redirect_naver_login_page():
naver_redirect_url=f"https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id={client_id}&state=STATE_STRING&redirect_uri={redirect_uri}"
return redirect(naver_redirect_url)
@bp.route("/oauth/naver/callback")
def access():
code = request.args.get('code')
token_request_url=f"https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&client_id={client_id}&client_secret={client_secret}&code={code}"
token_response = requests.get(token_request_url)
token_json = token_response.json()
token = token_json['access_token']
user_info_request_url="https://openapi.naver.com/v1/nid/me"
user_info = requests.get(user_info_request_url, headers={"Authorization":f"Bearer {token}"})
return jsonify(user_info.json())
๋ค์ ํ๋ก์ ํธ์ ์์ฑ๋๋ฅผ ์ํด ๊ตฌํ์์ ๊ธฐ๋ฅ์ ๋ํด ๊ณต๋ถ ์ค์ด๋ค.
๋ ๊ฐ๋ฐ๊ณต๋ถ๋ฅผ ํ ๋ ์ด๊ฑฐ ๊ณต๋ถ ํด์ ์ธ์ ์จ๋จน์ง ...
๋ผ๋ ๋ง์ฐํจ์ด ์์๋๋ฐ ์ด๋ฒ์๋ ๋น์ฅ ์จ๋จน์ ์ ์๋ ๊ธฐํ๊ฐ ์๊ฒผ๋ค. ์ด๋ฐ ์ ์ด ๋๊ธฐ๋ถ์ฌ๋ก ๋ค๊ฐ์ค๋ ๊ฒ ๊ฐ๋ค. ์์ฆ ๊ฐ๋ฐ ๊ณต๋ถํ ๋ง์ด ๋๋ค ใ
ใ
๐