14.2 基于令牌的认证

    上节我们介绍了基于http的认证, 由于客户端每次发出请求时都要发送密令, 为了避免老是发送敏感信息, 我们可以提供一种基于令牌的认证方案。

一. 修改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认证, 就会弹出类似下面的对话框要求用户填写认证信息

   

    如果我们填写的是token字符串, 那么密码栏为空, verify_password函数验证token, 并返回结果;

    如果我们填写的是email和password, 那么verify_password函数验证email和密码, 并返回结果;

    这里我们用g.token_used变量来让视图函数区分这两种认证方法。

    因此认证函数的作用就是, 认证所有访问 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}

代码分析:

    如果用户访问该路由获取token, 认证通过时, g.current_user会存储认证通过的用户, 然后访问该路由, 返回由该用户id生成的token字符串, g.token_used的if判断是为了防止使用旧token生成新token。

四。 效果演示

1)访问生成token的路由

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

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

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

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

6)返回错误


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值