Python如何使用jwt校验接口安全(以tornado为例)

1.Jwt简介

1. JWT是什么

JSON Web Token (JWT),它是目前最流行的跨域身份验证解决方案

2. 为什么使用JWT

JWT的数据是保存在客户端的。

3. JWT的工作原理

  1. 是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户,示例如下:
    {“UserName”: “wangdefa”,“Role”: “0”,“Expire”: “2018-08-08 20:15:56”}
  2. 之后,当用户与服务器通信时,客户在请求中发回JSON对象
  3. 为了防止用户篡改数据,服务器将在生成对象时添加签名,并对发回的数据进行验证

4. JWT组成

一个JWT实际上就是一个字符串,它由三部分组成:头部(Header)、载荷(Payload)与签名(signature)

二、Python构造jwt认证

架设我们jwt储存用户的id,身份,部门编号信息

1、生成jwt

import jwt
def make_jwt(user_id, role, id_code):
    """
    生成jwt
    :param user_id:  用户id
    :param role: 用户角色
    :param id_code: 用户部门编码
    :return:
    """
    payload = {
        "user_id": user_id,
        "role": role,
        "id_code": id_code,
        "exp": datetime.utcnow()
    }
    token = jwt.encode(payload, JWT_SALT, algorithm='HS256')
    return str(token, encoding="utf-8")

2、校验装饰器

例如校验role是否为0

def admin_auth(method):
    """管理员验证"""

    @wraps(method)
    def wrapper(self, *args, **kwargs):
        sessionid = self.request.headers.get("sessionid", None)
        if not sessionid:
            return self.write({'error': 10006, 'msg': '请先登录'})
        else:
            try:
                jwt_data = jwt.decode(sessionid, JWT_SALT, leeway=JWT_TIME,
                                      options={"verify_exp": True})
            except:
                return self.write({'error': 10006, 'msg': '登录信息过期!'})
            role = jwt_data["role"]
            if int(role) != 0:
                return self.write({'error': 10006, 'msg': '权限不足!'})
            return method(self, *args, **kwargs)

    return wrapper
更新时间:2017-09-21 23:38:04

本文由 智慧煮粥 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:http://zz.zzhub.cn/archives/pythonjwt
最后更新:2017-09-21 23:38:04

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×