14.2 基于令牌的认证

匿名 (未验证) 提交于 2019-12-03 00:22:01

一. 修改app/models.py

class User(db.Model):      #生成认证令牌      def generate_auth_token(self, expiration):          s = Serializer(current_app.config['SECRET_KEY'], expires_in=expiration)          return s.dumps({'id': self.id})       #验证认证令牌, 如果令牌可用就返回对应的用户      @staticmethod      def verify_auth_token(self, token):          s = Serializer(current_app.config['SECRET_KEY'])          try:              data = s.loads()          except:              return None          return User.query.get(data['id'])

二. 修改app/api_1_0/authentication.py

@auth.verify_password  def verify_password(email_or_token, password):      #如果填的是token字符串      if password = '':          g.current_user = User.verify_auth_token(email_or_token)          g.token_userd = True          return g.current_user is not None     #如果填的是email和密码      user = User.query.filter_by(email=email_or_token).first()      if not user:          return False      g.current_user = user      g.token_used = False      return user.verify_password(password)

代码分析:

用户访问api蓝本注册的路由时, 首先会访问@api.before_request修饰器修饰的before_request函数, 而before_request函数被修饰器@auth.login_required修饰, 所以会触发auth.verify_password认证, 就会弹出类似下面的对话框要求用户填写认证信息

因此认证函数的作用就是, 认证所有访问 api蓝本注册的路由 的用户, 如果认证通过g.current_user存储认证通过的用户, 并访问路由, 认证失败则无法访问路由。

三. 修改app/api_1_0/authentication.py

@api.route('/token')  def get_token():      if g.token_used:          return unauthorized('Invalid credentials')      return jsonify({'token': g.current_user.generate_auth_token(expiration=3600), 'expiration': 3600} 

代码分析:

四。 效果演示

1)访问生成token的路由

2)填写用户名密码进行认证

3)认证成功,视图函数返回生成的token字符串

4)下次访问api注册的路由时就可以填写token字符串

5)如果我们试图用旧token生成新token

6)返回错误


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!