1
0
mirror of https://github.com/LukePeters/flask-mongo-api-boilerplate.git synced 2026-05-14 14:16:29 +09:00
Files
2019-02-17 17:04:03 -05:00

65 lines
1.9 KiB
Python

from flask import current_app as app
from flask import request
from functools import wraps
from main.tools import JsonResp
from jose import jwt
import datetime
# Auth Decorator
def token_required(f):
@wraps(f)
def decorated(*args, **kwargs):
access_token = request.headers.get('AccessToken')
try:
data = jwt.decode(access_token, app.config['SECRET_KEY'])
except Exception as e:
return JsonResp({ "message": "Token is invalid", "exception": str(e) }, 401)
return f(*args, **kwargs)
return decorated
def encodeAccessToken(user_id, email, plan):
accessToken = jwt.encode({
"user_id": user_id,
"email": email,
"plan": plan,
"exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=15) # The token will expire in 15 minutes
}, app.config["SECRET_KEY"], algorithm="HS256")
return accessToken
def encodeRefreshToken(user_id, email, plan):
refreshToken = jwt.encode({
"user_id": user_id,
"email": email,
"plan": plan,
"exp": datetime.datetime.utcnow() + datetime.timedelta(weeks=4) # The token will expire in 4 weeks
}, app.config["SECRET_KEY"], algorithm="HS256")
return refreshToken
def refreshAccessToken(refresh_token):
# If the refresh_token is still valid, create a new access_token and return it
try:
user = app.db.users.find_one({ "refresh_token": refresh_token }, { "_id": 0, "id": 1, "email": 1, "plan": 1 })
if user:
decoded = jwt.decode(refresh_token, app.config["SECRET_KEY"])
new_access_token = encodeAccessToken(decoded["user_id"], decoded["email"], decoded["plan"])
result = jwt.decode(new_access_token, app.config["SECRET_KEY"])
result["new_access_token"] = new_access_token
resp = JsonResp(result, 200)
else:
result = { "message": "Auth refresh token has expired" }
resp = JsonResp(result, 403)
except:
result = { "message": "Auth refresh token has expired" }
resp = JsonResp(result, 403)
return resp