33import json
44import logging
55import 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
98from 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
1214from .factory import create_app , create_user
1315
1416logger = logging .getLogger (__name__ )
1517app = 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
2646def 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' ])
3457def 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
4282def 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 ,
0 commit comments