import json
from datetime import datetime, timedelta
import jwt
from Crypto.Hash import SHA256
from flask import make_response, current_app
from flask_restful import Resource, reqparse
from model.user import User
class AuthResource(Resource):
def __init__(self):
self.parser = reqparse.RequestParser()
self.parser.add_argument('username', location='form', default=None, help='username')
self.parser.add_argument('password', location='form', default=None, help='password')
def post(self):
args = self.parser.parse_args()
user = self._get_user_by_username(args.username)
if user is not None:
hash = self._password_hash(args.password)
if user.password == hash:
token = self._make_token(user)
return make_response(token, 200)
return make_response('', 401)
def _get_user_by_username(self, username):
"""
reads a user by its username
:param username:
:return:
"""
with open('./files/users.json', encoding='UTF-8') as file:
users_dict = json.load(file)
for data in users_dict:
if data['username'] == username:
user = User(
username=data['username'],
password=data['password'],
role=data['role']
)
return user
return None
def _password_hash(self, password):
"""
creates the password hash
:param password:
:return:
"""
hash_object = SHA256.new(data=password.encode())
return hash_object.hexdigest()
def _make_token(self, user):
"""
creates the signed and encrypted token for a user
:param user:
:return:
"""
access = jwt.encode({
'username': user.username,
'userrole': user.role,
'exp': datetime.utcnow() + timedelta(minutes=current_app.config['TOKEN_DURATION'])
},
current_app.config['ACCESS_TOKEN_KEY']
)
return access