52 lines
1.8 KiB
Python
52 lines
1.8 KiB
Python
import jwt
|
|
from datetime import datetime, timedelta
|
|
from flask import request
|
|
from mock_data import MOCK_USERS, UserInfo
|
|
|
|
# TODO: Replace with your own secret key
|
|
ACCESS_TOKEN_SECRET = 'access_token_secret'
|
|
REFRESH_TOKEN_SECRET = 'refresh_token_secret'
|
|
|
|
def generate_access_token(user: UserInfo):
|
|
payload = {
|
|
'user': user,
|
|
'iat': datetime.utcnow(),
|
|
'exp': datetime.utcnow() + timedelta(days=7)
|
|
}
|
|
return jwt.encode(payload, ACCESS_TOKEN_SECRET, algorithm='HS256')
|
|
|
|
def generate_refresh_token(user: UserInfo):
|
|
payload = {
|
|
'user': user,
|
|
'iat': datetime.utcnow(),
|
|
'exp': datetime.utcnow() + timedelta(days=30)
|
|
}
|
|
return jwt.encode(payload, REFRESH_TOKEN_SECRET, algorithm='HS256')
|
|
|
|
def verify_access_token():
|
|
auth_header = request.headers.get('Authorization')
|
|
if not auth_header or not auth_header.startswith('Bearer '):
|
|
return None
|
|
token = auth_header.split(' ')[1]
|
|
try:
|
|
decoded = jwt.decode(token, ACCESS_TOKEN_SECRET, algorithms=['HS256'])
|
|
username = decoded['user']['username']
|
|
user = next((u for u in MOCK_USERS if u['username'] == username), None)
|
|
if user:
|
|
user_info = {k: v for k, v in user.items() if k != 'password'}
|
|
return user_info
|
|
return None
|
|
except jwt.PyJWTError:
|
|
return None
|
|
|
|
def verify_refresh_token(token):
|
|
try:
|
|
decoded = jwt.decode(token, REFRESH_TOKEN_SECRET, algorithms=['HS256'])
|
|
username = decoded['user']['username']
|
|
user = next((u for u in MOCK_USERS if u['username'] == username), None)
|
|
if user:
|
|
user_info = {k: v for k, v in user.items() if k != 'password'}
|
|
return user_info
|
|
return None
|
|
except jwt.PyJWTError:
|
|
return None |