포도가게의 개발일지
Flask pyJWT token 사용법 본문
반응형
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');
'웹' 카테고리의 다른 글
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