A multipurpose python flask API server and administration SPA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
3.2 KiB

  1. """Authentication API blueprint and endpoint definitions."""
  2. from flask import Blueprint, g, abort, request
  3. from corvus.api.decorators import return_json
  4. from corvus.api.model import APIMessage, APIResponse
  5. from corvus.middleware import authentication_middleware
  6. from corvus.service import (
  7. user_token_service,
  8. authentication_service,
  9. user_service,
  10. transformation_service
  11. )
  12. from corvus.middleware.authentication_middleware import Auth
  13. from corvus.service.role_service import Role
  14. from corvus.model import UserToken
  15. AUTH_BLUEPRINT = Blueprint(
  16. name='auth', import_name=__name__, url_prefix='/auth')
  17. @AUTH_BLUEPRINT.route('/login', methods=['POST'])
  18. @return_json
  19. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  20. def login() -> APIResponse:
  21. """
  22. Get a token for continued authentication.
  23. :return: A login token for continued authentication
  24. """
  25. user_token = user_token_service.create(g.user)
  26. return APIResponse(user_token, 200)
  27. @AUTH_BLUEPRINT.route('/bump', methods=['POST'])
  28. @return_json
  29. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  30. def login_bump() -> APIResponse:
  31. """
  32. Update the user last seen timestamp.
  33. :return: A time stamp for the bumped login
  34. """
  35. user_service.update_last_login_time(g.user)
  36. return APIResponse(g.user, 200, ['lastLoginTime'])
  37. @AUTH_BLUEPRINT.route('/logout', methods=['POST'])
  38. @return_json
  39. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  40. def logout() -> APIResponse:
  41. """
  42. Logout and delete a token.
  43. :return:
  44. """
  45. authentication_service.logout(g.user_token)
  46. return APIResponse(APIMessage(True, None), 200)
  47. @AUTH_BLUEPRINT.route('/token', methods=['GET'])
  48. @return_json
  49. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  50. def get_tokens() -> APIResponse:
  51. user_tokens = user_token_service.find_by_user(g.user)
  52. return APIResponse(user_tokens, 200)
  53. @AUTH_BLUEPRINT.route('/token', methods=['POST'])
  54. @return_json
  55. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  56. def create_token():
  57. requested_token: UserToken = transformation_service.deserialize_model(
  58. UserToken, request.json, options=['note', 'enabled', 'expirationTime'])
  59. user_token = user_token_service.create(g.user, requested_token.note, requested_token.enabled, requested_token.expiration_time)
  60. return APIResponse(user_token, 200)
  61. @AUTH_BLUEPRINT.route('/token/<token>', methods=['GET'])
  62. @return_json
  63. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  64. def get_token(token: str):
  65. user_token = user_token_service.find_by_user_and_token(g.user, token)
  66. if user_token is None:
  67. return abort(404)
  68. return APIResponse(user_token, 200)
  69. @AUTH_BLUEPRINT.route('/token/<token>', methods=['DELETE'])
  70. @return_json
  71. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  72. def delete_token(token: str):
  73. user_token = user_token_service.find_by_user_and_token(g.user, token)
  74. if user_token is None:
  75. return abort(404)
  76. user_token_service.delete(user_token)
  77. return APIResponse(None, 200)