from flask import current_app from app.libs.error_code import AuthFailed, Success from app.libs.redprint import Redprint from app.models.user import User from app.validators.forms import ClientForm, TokenForm from authlib.jose import jwt, JoseError, errors from datetime import datetime api = Redprint('token') @api.route('', methods=['POST']) def get_token(): form = ClientForm().validate_for_api() userinfo = User.verify(form.account.data, form.secret.data) # Token token = generate_token({'uid':userinfo['uid']}) t = { 'token': token.decode('utf8') } return Success(result=t) @api.route('/secret', methods=['POST']) def get_token_info(): """获取令牌信息""" form = TokenForm().validate_for_api() key = current_app.config['SECRET_KEY'] try: data = jwt.decode(s=form.token.data, key=key) data.validate_exp(now=datetime.now().timestamp(), leeway=current_app.config['TOKEN_EXPIRATION']) except errors.ExpiredTokenError: return AuthFailed(message='token过期') except JoseError: return AuthFailed() return Success(result=data) def generate_token(data): """生成用于邮箱验证的JWT(json web token)""" # 签名算法 header = {'alg': 'HS256'} # 用于签名的** key = current_app.config['SECRET_KEY'] # palyload expire = datetime.now().timestamp() + current_app.config['TOKEN_EXPIRATION'] payload = {'exp': expire} payload.update(data) # 待签名的数据负载 return jwt.encode(header, payload, key)