🔥 TIL - Day 19


2つ目のプロジェクトのために、flaskで複数のソーシャルログインが実現された.oauthの概念を正しく理解し、実施したところ、サービスの種類にかかわらず、正式な文書だけで実施できることが分かった.(喜び)
KACA、NAVER、フェイスブック、Googleなどを2つ目のプロジェクトに応用したいので、早めに実施する予定です.まずはKACAとNAVERを実現
📌 鍵管理!!
実装前に、APIおよびGithubを使用するには、鍵管理が必要である.いろいろな方法がありますが、見つけたのはpython-decouple庫です.
ライブラリのインストール
pip install python-decouple
setting.iniで鍵を定義するkey=valueの形態として定義される.
[settings]
KAKAO_REST_API=MY_KEY

NAVER_CLIENT=MY_KEY
NAVER_CLIENT_SECRET=MY_KEY
定義されたキー値を入力
まず,デカップリングライブラリのconfigメソッドをインポートする.
from decouple import config
持ってくるのは簡単です.
client_id = config("KAKAO_REST_API")
📌 Flaskでkakao loginを使う
プロセスは同じです.
  • Kakaログイン要求を受信すると、Kakaログインページに移動します.
    この場合、アプリケーション生成時に指定したredirect_uriを設定する必要があります.このredirect_uriで回答すると엑세스 토큰인증코드を受け取ることができる.
  • 2인증코드が受信された場合、엑세스 토큰は、対応するコードによって要求される.
  • 回答
  • 엑세스 토큰,要求사용자 정보.
  • 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())
    受信したユーザ情報を適宜データベースに保存し、jwt等を用いて現在のユーザの認証処理を行う.
    📌 Flashでのnaver loginの使用
    ほとんど同じです.
    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())
    次のプロジェクトを完了するために、計画実施の機能を学習しています.
    開発をよく勉強していた頃は이거 공부 해서 언제 써먹지 ...と迷っていましたが、今回はすぐに現れる機会がありました.この点が励ましになったようだ.最近開発を学ぶ味がします😁