포도가게의 개발일지

Flask pyJWT token 사용법 본문

Flask pyJWT token 사용법

grape.store 2021. 7. 30. 23:33
반응형
import datetime
import os
from flask import Flask, request, render_template, jsonify, redirect, url_for
from bson.objectid import ObjectId
import math
from pymongo import MongoClient
## pyjwt import ##
import jwt
## functools import ##
from functools import wraps

app = Flask(__name__)

## encode할 secret-key ##
app.config['SECRET_KEY'] = 'dance'

## db 대신 사용할 임시 로그인 저장정보 ##
admin_id = 'qwer'
admin_pw = '1234'


client = MongoClient('localhost', 27017)
db = client.cityclone

## 클라이언트로 부여한 token 정보가 있는지 check ##
def check_for_token(func):
    @wraps(func)
    def wrapped(*args, **kwargs):
    ## url ? key = value 형태로 js상에서 token 정보를 보내준다 ##
        token = request.args.get('token')
        ## decode 방법이 jwt.decode(token, secret key, algorithms으로 바뀜)
        #data = jwt.decode(token, app.config['SECRET_KEY'], algorithms='HS256')
        if not token:
            return jsonify({'message': 'Missing token'}), 403
        try:
            data = jwt.decode(token, app.config['SECRET_KEY'], algorithms='HS256')
        ## token 만료기간이 지났으면 login page로 redirect 해줌
        except:
            return redirect('/login')
        return func(*args, **kwargs)
    return wrapped

@app.route("/login", methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        login_id = request.form['id_give']
        login_pw = request.form['pw_give']
        if login_id == admin_id:
        ## 로그인 정보가 맞으면 token을 클라이언트에게 부여 ##
            token = jwt.encode({
                'user_id': login_id,
                'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=60)
            },
            app.config['SECRET_KEY'], algorithm='HS256')
            return jsonify({'token': token})
    else:
        return render_template('login.html')


@app.route('/user_only', methods=["GET"])
## 허락된 사용자만 접근가능하게 해준다 ##
@check_for_token -> token이 없거나 만료됬으면 여기서 아웃
def user_only():
    return render_template('add_city.html')
    
if __name__ == '__main__':
    app.run(debug=True)
///////////////////////////////log in script //////////////////////////////////////
function log_in() {

            let id = $('#id_give').val();
            let pw = $('#pw_give').val();

            $.ajax({
                type: "POST",
                url: "/login",
                data: {id_give:id,pw_give:pw},
                success: function (response) { 
            ## 생성된 token은 session, cookie , local storage를 통해 저장 된다 ## 
                    localStorage.setItem('token', response['token']);
                }
            })
        }

////////////////////////////send token script //////////////////////////////////////
 ## ajax 호출은 redirect or render_template를 사용할수없어 location href 같은 url 주소 사용##
 ## 저장된 인증 정보를 불러와 보내줌 ##
let autho = `${localStorage.getItem('token')}`;
window.open(`/user_only?token=${autho}`, 'user', 'width=1000px,height=700px,scrollbars-yes');

decode 처리된 json data

'' 카테고리의 다른 글

Restful API?  (0) 2022.01.18
Socket vs WebSocket vs Socket.IO?  (0) 2021.11.26
url parameter 주고 받는법  (0) 2021.07.27
JSON이란?  (0) 2021.07.12
$.ajax is not a function(jQuery 에러)  (0) 2021.07.07
Comments