login.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import flask_login
  2. from flask import current_app, request
  3. from flask_restful import Resource, reqparse
  4. import services
  5. from controllers.console import api
  6. from controllers.console.setup import setup_required
  7. from libs.helper import email
  8. from libs.password import valid_password
  9. from services.account_service import AccountService
  10. class LoginApi(Resource):
  11. """Resource for user login."""
  12. @setup_required
  13. def post(self):
  14. """Authenticate user and login."""
  15. parser = reqparse.RequestParser()
  16. parser.add_argument('email', type=email, required=True, location='json')
  17. parser.add_argument('password', type=valid_password, required=True, location='json')
  18. parser.add_argument('remember_me', type=bool, required=False, default=False, location='json')
  19. args = parser.parse_args()
  20. # todo: Verify the recaptcha
  21. try:
  22. account = AccountService.authenticate(args['email'], args['password'])
  23. except services.errors.account.AccountLoginError:
  24. return {'code': 'unauthorized', 'message': 'Invalid email or password'}, 401
  25. AccountService.update_last_login(account, request)
  26. # todo: return the user info
  27. token = AccountService.get_account_jwt_token(account)
  28. return {'result': 'success', 'data': token}
  29. class LogoutApi(Resource):
  30. @setup_required
  31. def get(self):
  32. flask_login.logout_user()
  33. return {'result': 'success'}
  34. class ResetPasswordApi(Resource):
  35. @setup_required
  36. def get(self):
  37. parser = reqparse.RequestParser()
  38. parser.add_argument('email', type=email, required=True, location='json')
  39. args = parser.parse_args()
  40. # import mailchimp_transactional as MailchimpTransactional
  41. # from mailchimp_transactional.api_client import ApiClientError
  42. account = {'email': args['email']}
  43. # account = AccountService.get_by_email(args['email'])
  44. # if account is None:
  45. # raise ValueError('Email not found')
  46. # new_password = AccountService.generate_password()
  47. # AccountService.update_password(account, new_password)
  48. # todo: Send email
  49. MAILCHIMP_API_KEY = current_app.config['MAILCHIMP_TRANSACTIONAL_API_KEY']
  50. # mailchimp = MailchimpTransactional(MAILCHIMP_API_KEY)
  51. message = {
  52. 'from_email': 'noreply@example.com',
  53. 'to': [{'email': account.email}],
  54. 'subject': 'Reset your Dify password',
  55. 'html': """
  56. <p>Dear User,</p>
  57. <p>The Dify team has generated a new password for you, details as follows:</p>
  58. <p><strong>{new_password}</strong></p>
  59. <p>Please change your password to log in as soon as possible.</p>
  60. <p>Regards,</p>
  61. <p>The Dify Team</p>
  62. """
  63. }
  64. # response = mailchimp.messages.send({
  65. # 'message': message,
  66. # # required for transactional email
  67. # ' settings': {
  68. # 'sandbox_mode': current_app.config['MAILCHIMP_SANDBOX_MODE'],
  69. # },
  70. # })
  71. # Check if MSG was sent
  72. # if response.status_code != 200:
  73. # # handle error
  74. # pass
  75. return {'result': 'success'}
  76. api.add_resource(LoginApi, '/login')
  77. api.add_resource(LogoutApi, '/logout')