Advertisement
Guest User

Untitled

a guest
Feb 27th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.78 KB | None | 0 0
  1. import datetime
  2. from functools import wraps
  3.  
  4. from flask import Flask, jsonify, request, make_response
  5. from flask_sqlalchemy import SQLAlchemy
  6. from flask_marshmallow import Marshmallow
  7. from werkzeug.security import (
  8. generate_password_hash,
  9. check_password_hash
  10. )
  11. from flask_jwt_extended import (
  12. JWTManager,
  13. jwt_required,
  14. create_access_token,
  15. get_jwt_identity
  16. )
  17. from flask_jwt_extended.utils import decode_token
  18.  
  19. app = Flask(__name__)
  20.  
  21. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
  22. app.config['SECRET_KEY'] = 'super-secret-key'
  23. app.config['JWT_SECRET_KEY'] = 'super-secret-key'
  24.  
  25. db = SQLAlchemy(app)
  26. ma = Marshmallow(app)
  27. jwt = JWTManager(app)
  28.  
  29.  
  30. class User(db.Model):
  31. id = db.Column(db.Integer, primary_key=True)
  32. username = db.Column(db.String, nullable=False)
  33. password_hash = db.Column(db.String, nullable=False)
  34. admin = db.Column(db.Boolean, default=False)
  35.  
  36. def __init__(self, username, password):
  37. self.username = username
  38. self.set_password(password)
  39.  
  40. def set_password(self, password):
  41. self.password_hash = generate_password_hash(password)
  42.  
  43. def check_password(self, password):
  44. return check_password_hash(self.password_hash, password)
  45.  
  46.  
  47. class UserSchema(ma.Schema):
  48. class Meta:
  49. fields = ['username', 'admin', '_links']
  50.  
  51. _links = ma.Hyperlinks({
  52. 'self': ma.URLFor('get_user', id='<id>'),
  53. 'collection': ma.URLFor('get_users')
  54. })
  55.  
  56. user_schema = UserSchema()
  57. users_schema = UserSchema(many=True)
  58.  
  59.  
  60. def current_user(func):
  61. @wraps(func)
  62. def wrapped(*args, **kwargs):
  63. username = get_jwt_identity()
  64. current_user = User.query.filter(User.username==username).one()
  65. return func(current_user, *args, **kwargs)
  66. return wrapped
  67.  
  68.  
  69. def admin_only(func):
  70. @wraps(func)
  71. def wrapped(current_user, *args, **kwargs):
  72. if not current_user.admin:
  73. return jsonify(msg='Must be an admin'), 401
  74. return func(current_user, *args, **kwargs)
  75. return wrapped
  76.  
  77.  
  78. @app.route('/', methods=['GET'])
  79. def index():
  80. return jsonify('Basic JWT app')
  81.  
  82.  
  83. @app.route('/users', methods=['GET'])
  84. def get_users():
  85. users = User.query.all()
  86. return users_schema.jsonify(users)
  87.  
  88.  
  89. @app.route('/users/<int:id>', methods=['GET'])
  90. def get_user(id):
  91. user = User.query.get(id)
  92. return user_schema.jsonify(user)
  93.  
  94.  
  95. @app.route('/users', methods=['POST'])
  96. def create_user():
  97. data = request.get_json()
  98. user = User(
  99. username = data['username'],
  100. password = data['password'])
  101. db.session.add(user)
  102. db.session.commit()
  103. return user_schema.jsonify(user)
  104.  
  105.  
  106. @app.route('/auth', methods=['POST'])
  107. def get_token():
  108. data = request.json
  109. username = data.get('username')
  110. password = data.get('password')
  111.  
  112. if not username and password:
  113. return jsonify({'error': 'Missing username or password'}), 400
  114.  
  115. user = User.query.filter(User.username==username).one()
  116. if not (user and user.check_password(password)):
  117. return jsonify({'error': 'Incorrect username or password'}), 401
  118.  
  119. access_token = create_access_token(identity=username)
  120. return jsonify(access_token=access_token), 200
  121.  
  122.  
  123. @app.route('/auth/exp', methods=['GET'])
  124. @jwt_required
  125. def get_exp():
  126. auth = request.headers['Authorization']
  127. token = auth.split(' ')[-1]
  128. decoded_token = decode_token(token)
  129. exp = decoded_token.get('exp')
  130. expires_at = datetime.datetime.fromtimestamp(exp).strftime('%c')
  131. return jsonify(expires_at=expires_at)
  132.  
  133.  
  134. @app.route('/protected', methods=['GET'])
  135. @jwt_required
  136. @current_user
  137. def protected(current_user):
  138. return jsonify(logged_in_as=current_user.username), 200
  139.  
  140.  
  141. @app.route('/admin', methods=['GET'])
  142. @jwt_required
  143. @current_user
  144. @admin_only
  145. def admin(current_user):
  146. return '', 204
  147.  
  148.  
  149. if __name__ == '__main__':
  150. app.run(debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement