Client: login/register
Client: login/register Client: login/register Client: login/register Client: login/register Client: login/register Client: login/register Client: login/register Client: login/register
This commit is contained in:
@ -32,3 +32,16 @@ if app.debug:
|
||||
).handlers = logging.getLogger('werkzeug').handlers
|
||||
logging.getLogger('sqlalchemy.orm').setLevel(logging.WARNING)
|
||||
appLog.setLevel(logging.DEBUG)
|
||||
|
||||
if app.debug :
|
||||
# Enable CORS
|
||||
@app.after_request
|
||||
def after_request(response):
|
||||
response.headers.add('Access-Control-Allow-Origin', '*')
|
||||
response.headers.add(
|
||||
'Access-Control-Allow-Headers', 'Content-Type,Authorization'
|
||||
)
|
||||
response.headers.add(
|
||||
'Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS'
|
||||
)
|
||||
return response
|
||||
|
@ -191,3 +191,42 @@ class TestAuthBlueprint(BaseTestCase):
|
||||
self.assertTrue(
|
||||
data['message'] == 'Invalid token. Please log in again.')
|
||||
self.assertEqual(response.status_code, 401)
|
||||
|
||||
def test_user_profile(self):
|
||||
add_user('test', 'test@test.com', 'test')
|
||||
with self.client:
|
||||
resp_login = self.client.post(
|
||||
'/api/auth/login',
|
||||
data=json.dumps(dict(
|
||||
email='test@test.com',
|
||||
password='test'
|
||||
)),
|
||||
content_type='application/json'
|
||||
)
|
||||
response = self.client.get(
|
||||
'/api/auth/profile',
|
||||
headers=dict(
|
||||
Authorization='Bearer ' + json.loads(
|
||||
resp_login.data.decode()
|
||||
)['auth_token']
|
||||
)
|
||||
)
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertTrue(data['status'] == 'success')
|
||||
self.assertTrue(data['data'] is not None)
|
||||
self.assertTrue(data['data']['username'] == 'test')
|
||||
self.assertTrue(data['data']['email'] == 'test@test.com')
|
||||
self.assertTrue(data['data']['created_at'])
|
||||
self.assertFalse(data['data']['admin'])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_invalid_profile(self):
|
||||
with self.client:
|
||||
response = self.client.get(
|
||||
'/api/auth/profile',
|
||||
headers=dict(Authorization='Bearer invalid'))
|
||||
data = json.loads(response.data.decode())
|
||||
self.assertTrue(data['status'] == 'error')
|
||||
self.assertTrue(
|
||||
data['message'] == 'Invalid token. Please log in again.')
|
||||
self.assertEqual(response.status_code, 401)
|
||||
|
@ -4,6 +4,7 @@ from sqlalchemy import exc, or_
|
||||
from mpwo_api import appLog, bcrypt, db
|
||||
|
||||
from .models import User
|
||||
from .utils import authenticate
|
||||
|
||||
auth_blueprint = Blueprint('auth', __name__)
|
||||
|
||||
@ -12,7 +13,9 @@ auth_blueprint = Blueprint('auth', __name__)
|
||||
def register_user():
|
||||
# get post data
|
||||
post_data = request.get_json()
|
||||
if not post_data:
|
||||
if not post_data or post_data.get('username') is None \
|
||||
or post_data.get('email') is None \
|
||||
or post_data.get('password') is None:
|
||||
response_object = {
|
||||
'status': 'error',
|
||||
'message': 'Invalid payload.'
|
||||
@ -52,9 +55,10 @@ def register_user():
|
||||
except (exc.IntegrityError, exc.OperationalError, ValueError) as e:
|
||||
db.session.rollback()
|
||||
appLog.error(e)
|
||||
|
||||
response_object = {
|
||||
'status': 'error',
|
||||
'message': 'Invalid payload.'
|
||||
'message': 'Error. Please try again or contact the administrator.'
|
||||
}
|
||||
return jsonify(response_object), 400
|
||||
|
||||
@ -95,19 +99,20 @@ def login_user():
|
||||
appLog.error(e)
|
||||
response_object = {
|
||||
'status': 'error',
|
||||
'message': 'Try again'
|
||||
'message': 'Error. Please try again or contact the administrator.'
|
||||
}
|
||||
return jsonify(response_object), 500
|
||||
|
||||
|
||||
@auth_blueprint.route('/auth/logout', methods=['GET'])
|
||||
def logout_user():
|
||||
@authenticate
|
||||
def logout_user(user_id):
|
||||
# get auth token
|
||||
auth_header = request.headers.get('Authorization')
|
||||
if auth_header:
|
||||
auth_token = auth_header.split(" ")[1]
|
||||
resp = User.decode_auth_token(auth_token)
|
||||
if not isinstance(resp, str):
|
||||
if not isinstance(user_id, str):
|
||||
response_object = {
|
||||
'status': 'success',
|
||||
'message': 'Successfully logged out.'
|
||||
@ -125,3 +130,20 @@ def logout_user():
|
||||
'message': 'Provide a valid auth token.'
|
||||
}
|
||||
return jsonify(response_object), 403
|
||||
|
||||
|
||||
@auth_blueprint.route('/auth/profile', methods=['GET'])
|
||||
@authenticate
|
||||
def get_user_status(user_id):
|
||||
user = User.query.filter_by(id=user_id).first()
|
||||
response_object = {
|
||||
'status': 'success',
|
||||
'data': {
|
||||
'id': user.id,
|
||||
'username': user.username,
|
||||
'email': user.email,
|
||||
'created_at': user.created_at,
|
||||
'admin': user.admin,
|
||||
}
|
||||
}
|
||||
return jsonify(response_object), 200
|
||||
|
35
mpwo_api/mpwo_api/users/utils.py
Normal file
35
mpwo_api/mpwo_api/users/utils.py
Normal file
@ -0,0 +1,35 @@
|
||||
from functools import wraps
|
||||
|
||||
from flask import request, jsonify
|
||||
|
||||
from .models import User
|
||||
|
||||
|
||||
def authenticate(f):
|
||||
@wraps(f)
|
||||
def decorated_function(*args, **kwargs):
|
||||
response_object = {
|
||||
'status': 'error',
|
||||
'message': 'Something went wrong. Please contact us.'
|
||||
}
|
||||
code = 401
|
||||
auth_header = request.headers.get('Authorization')
|
||||
if not auth_header:
|
||||
response_object['message'] = 'Provide a valid auth token.'
|
||||
code = 403
|
||||
return jsonify(response_object), code
|
||||
auth_token = auth_header.split(" ")[1]
|
||||
resp = User.decode_auth_token(auth_token)
|
||||
if isinstance(resp, str):
|
||||
response_object['message'] = resp
|
||||
return jsonify(response_object), code
|
||||
user = User.query.filter_by(id=resp).first()
|
||||
if not user:
|
||||
return jsonify(response_object), code
|
||||
return f(resp, *args, **kwargs)
|
||||
return decorated_function
|
||||
|
||||
|
||||
def is_admin(user_id):
|
||||
user = User.query.filter_by(id=user_id).first()
|
||||
return user.admin
|
Reference in New Issue
Block a user