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.

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