token.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from flask import current_app
  2. from app.libs.error_code import AuthFailed, Success
  3. from app.libs.redprint import Redprint
  4. from app.models.user import User
  5. from app.validators.forms import ClientForm, TokenForm
  6. from authlib.jose import jwt, JoseError, errors
  7. from datetime import datetime
  8. api = Redprint('token')
  9. @api.route('', methods=['POST'])
  10. def get_token():
  11. form = ClientForm().validate_for_api()
  12. userinfo = User.verify(form.account.data, form.secret.data)
  13. # Token
  14. token = generate_token({'uid':userinfo['uid']})
  15. t = {
  16. 'token': token.decode('utf8')
  17. }
  18. return Success(result=t)
  19. @api.route('/secret', methods=['POST'])
  20. def get_token_info():
  21. """获取令牌信息"""
  22. form = TokenForm().validate_for_api()
  23. key = current_app.config['SECRET_KEY']
  24. try:
  25. data = jwt.decode(s=form.token.data, key=key)
  26. data.validate_exp(now=datetime.now().timestamp(), leeway=current_app.config['TOKEN_EXPIRATION'])
  27. except errors.ExpiredTokenError:
  28. return AuthFailed(message='token过期')
  29. except JoseError:
  30. return AuthFailed()
  31. return Success(result=data)
  32. def generate_token(data):
  33. """生成用于邮箱验证的JWT(json web token)"""
  34. # 签名算法
  35. header = {'alg': 'HS256'}
  36. # 用于签名的**
  37. key = current_app.config['SECRET_KEY']
  38. # palyload
  39. expire = datetime.now().timestamp() + current_app.config['TOKEN_EXPIRATION']
  40. payload = {'exp': expire}
  41. payload.update(data)
  42. # 待签名的数据负载
  43. return jwt.encode(header, payload, key)