login.py 3.6 KB

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