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.

126 lines
4.0 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, APIPage
  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. from corvus.utility.pagination_utility import get_pagination_params
  16. AUTH_BLUEPRINT = Blueprint(
  17. name='auth', import_name=__name__, url_prefix='/auth')
  18. @AUTH_BLUEPRINT.route('/login', methods=['POST'])
  19. @return_json
  20. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  21. def login() -> APIResponse:
  22. """
  23. Get a token for continued authentication.
  24. :return: A login token for continued authentication
  25. """
  26. user_token = user_token_service.create(g.user)
  27. return APIResponse(user_token, 200)
  28. @AUTH_BLUEPRINT.route('/bump', methods=['POST'])
  29. @return_json
  30. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  31. def login_bump() -> APIResponse:
  32. """
  33. Update the user last seen timestamp.
  34. :return: A time stamp for the bumped login
  35. """
  36. user_service.update_last_login_time(g.user)
  37. return APIResponse(g.user, 200, ['lastLoginTime'])
  38. @AUTH_BLUEPRINT.route('/logout', methods=['POST'])
  39. @return_json
  40. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  41. def logout() -> APIResponse:
  42. """
  43. Logout and delete a token.
  44. :return:
  45. """
  46. authentication_service.logout(g.user_token)
  47. return APIResponse(APIMessage(True, None), 200)
  48. @AUTH_BLUEPRINT.route('/token', methods=['GET'])
  49. @return_json
  50. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  51. def get_tokens() -> APIResponse:
  52. """
  53. Get a list of all tokens for the current user
  54. :return: a paginated list of user tokens
  55. """
  56. page, per_page = get_pagination_params(request.args)
  57. user_token_page = user_token_service.find_by_user(g.user, page, per_page)
  58. if user_token_page is not None:
  59. return APIResponse(APIPage.from_page(user_token_page), 200)
  60. return abort(404)
  61. @AUTH_BLUEPRINT.route('/token', methods=['POST'])
  62. @return_json
  63. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  64. def create_token():
  65. """
  66. Create a new token with optional parameters
  67. note: String
  68. enabled: Boolean
  69. expirationTime: DateTime
  70. :return: The new token with the optional parameters
  71. """
  72. requested_token: UserToken = transformation_service.deserialize_model(
  73. UserToken, request.json, options=['note', 'enabled', 'expirationTime'])
  74. user_token = user_token_service.create(
  75. g.user, requested_token.note, requested_token.enabled, requested_token.expiration_time)
  76. return APIResponse(user_token, 200)
  77. @AUTH_BLUEPRINT.route('/token/<token>', methods=['GET'])
  78. @return_json
  79. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  80. def get_token(token: str):
  81. """
  82. Retrieve a specific token for this user
  83. :param token: The token to retrieve for this user
  84. :return: The token if it exists
  85. """
  86. user_token = user_token_service.find_by_user_and_token(g.user, token)
  87. if user_token is None:
  88. return abort(404)
  89. return APIResponse(user_token, 200)
  90. @AUTH_BLUEPRINT.route('/token/<token>', methods=['DELETE'])
  91. @return_json
  92. @authentication_middleware.require(required_auth=Auth.BASIC, required_role=Role.USER)
  93. def delete_token(token: str):
  94. """
  95. Delete a specific token for this user
  96. :param token: The token to delete for this user
  97. :return: Nothing on success
  98. """
  99. user_token = user_token_service.find_by_user_and_token(g.user, token)
  100. if user_token is None:
  101. return abort(404)
  102. user_token_service.delete(user_token)
  103. return APIResponse(APIMessage(True, None), 200)