Skip to content

Commit 223f9fd

Browse files
author
Ankur Srivastava
committed
integrated jwt with backend
1 parent 7357f14 commit 223f9fd

File tree

2 files changed

+60
-11
lines changed

2 files changed

+60
-11
lines changed

backend/flask_app/server.py

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@
33
import json
44
import logging
55
import traceback
6-
7-
from flask import Response, request
8-
from flask_security import auth_token_required, utils
6+
from datetime import datetime
7+
from flask import Response, request, jsonify, current_app
98
from gevent.wsgi import WSGIServer
9+
from flask_jwt_simple import (
10+
JWTManager, jwt_required, create_jwt, get_jwt_identity, get_jwt
11+
)
1012

11-
from .app_utils import html_codes, token_login
13+
from .app_utils import html_codes
1214
from .factory import create_app, create_user
1315

1416
logger = logging.getLogger(__name__)
1517
app = create_app()
18+
jwt = JWTManager(app)
1619

1720

1821
@app.before_first_request
@@ -21,26 +24,71 @@ def init():
2124
create_user(app)
2225

2326

24-
@app.route("/api/logoutuser", methods=['POST'])
25-
@auth_token_required
27+
@jwt.jwt_data_loader
28+
def add_claims_to_access_token(identity):
29+
if identity == 'admin':
30+
roles = 'admin'
31+
else:
32+
roles = 'peasant'
33+
34+
now = datetime.utcnow()
35+
return {
36+
'exp': now + current_app.config['JWT_EXPIRES'],
37+
'iat': now,
38+
'nbf': now,
39+
'sub': identity,
40+
'roles': roles
41+
}
42+
43+
44+
@app.route("/api/logout", methods=['POST'])
45+
@jwt_required
2646
def logout():
2747
"""Logout the currently logged in user."""
48+
# TODO: handle this logout properly, very weird implementation.
49+
identity = get_jwt_identity()
50+
if not identity:
51+
return jsonify({"msg": "Token invalid"}), 401
2852
logger.info('Logged out user !!')
29-
utils.logout_user()
3053
return 'logged out successfully', 200
3154

3255

33-
@app.route('/api/loginuser', methods=['POST'])
56+
@app.route('/api/login', methods=['POST'])
3457
def login():
3558
"""View function for login view."""
3659
logger.info('Logged in user')
37-
return token_login.login_with_token(request, app)
60+
logger.info(request.get_json())
61+
62+
params = request.get_json()
63+
username = params.get('username', None)
64+
password = params.get('password', None)
3865

66+
if not username:
67+
return jsonify({"msg": "Missing username parameter"}), 400
68+
if not password:
69+
return jsonify({"msg": "Missing password parameter"}), 400
3970

40-
@app.route('/api/getdata', methods=['POST'])
41-
@auth_token_required
71+
# TODO Check from DB here
72+
if username != 'admin' or password != 'admin':
73+
return jsonify({"msg": "Bad username or password"}), 401
74+
75+
# Identity can be any data that is json serializable
76+
ret = {'jwt': create_jwt(identity=username), 'exp': datetime.utcnow() + current_app.config['JWT_EXPIRES']}
77+
return jsonify(ret), 200
78+
79+
80+
@app.route('/api/protected', methods=['POST'])
81+
@jwt_required
4282
def get_data():
4383
"""Get dummy data returned from the server."""
84+
jwt_data = get_jwt()
85+
if jwt_data['roles'] != 'admin':
86+
return jsonify(msg="Permission denied"), 403
87+
88+
identity = get_jwt_identity()
89+
if not identity:
90+
return jsonify({"msg": "Token invalid"}), 401
91+
4492
data = {'Heroes': ['Hero1', 'Hero2', 'Hero3']}
4593
json_response = json.dumps(data)
4694
return Response(json_response,

backend/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ Flask-Cors==3.0.3
44
Flask-Security==1.7.5
55
Flask-SQLAlchemy==2.2
66
git+https://github.com/ansrivas/pylogging.git
7+
flask-jwt-simple[asymmetric_crypto]

0 commit comments

Comments
 (0)