63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
from datetime import timedelta
|
|
from flask import Flask, abort, jsonify, make_response, request
|
|
from flask_bcrypt import Bcrypt
|
|
from flask_jwt_extended import JWTManager, create_access_token, create_refresh_token, get_jwt_identity, jwt_required
|
|
|
|
import logging
|
|
import sqlite3
|
|
import sys
|
|
|
|
app = Flask(__name__)
|
|
app.config['JWT_SECRET_KEY'] = 'secret' # TODO change and load from a secrets store
|
|
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = timedelta(hours=1)
|
|
app.config['JWT_REFRESH_TOKEN_EXPIRES'] = timedelta(days=30)
|
|
flask_bcrypt = Bcrypt(app)
|
|
jwt = JWTManager(app)
|
|
|
|
cur = sqlite3.connect("sms.db")
|
|
|
|
file_handler = logging.FileHandler('log/out.log')
|
|
file_handler.setLevel(logging.INFO)
|
|
file_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'))
|
|
app.logger.addHandler(file_handler)
|
|
app.logger.setLevel(logging.INFO)
|
|
|
|
|
|
@app.route("/login", methods=["POST"])
|
|
def login():
|
|
access_key = request.json.get("access_key", None)
|
|
if access_key is None:
|
|
return make_response(jsonify({"msg": "Missing access key"}), 400)
|
|
|
|
secret_key = request.json.get("secret_key", None)
|
|
if secret_key is None:
|
|
return make_response(jsonify({"msg": "Missing secret key"}), 400)
|
|
|
|
res = cur.execute("SELECT access_key, secret_key_hash FROM devices WHERE access_key = ?", (access_key,))
|
|
res_tuple = res.fetchone()
|
|
if res_tuple is None:
|
|
return make_response(jsonify({"msg": "Invalid access key or secret key"}), 401)
|
|
|
|
secret_key_hash = res_tuple[1]
|
|
if flask_bcrypt.check_password_hash(secret_key_hash, secret_key):
|
|
# generate and return JWT
|
|
return make_response(
|
|
jsonify({"access_token": create_access_token(identity=access_key),
|
|
"refresh_token": create_refresh_token(identity=access_key)}),
|
|
200)
|
|
else:
|
|
return make_response(jsonify({"msg": "Invalid access key or secret key"}), 401)
|
|
|
|
|
|
@app.route("/verify-token", methods=["GET"])
|
|
@jwt_required()
|
|
def verify_token():
|
|
return make_response(jsonify(logged_in_as=get_jwt_identity()), 200)
|
|
|
|
|
|
@app.route("/refresh-token", methods=["POST"])
|
|
@jwt_required(refresh=True)
|
|
def refresh_token():
|
|
return make_response(jsonify({"access_token": create_access_token(identity=get_jwt_identity())}), 200)
|
|
|