因为HTTP协议是无状态的,所以互联网服务离不开用户认证。
一般流程是下面这样:
1、用户向服务器发送用户名和密码。
2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
3、服务器向用户返回一个 session_id,写入用户的 Cookie。
4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。
上面用的是Session实现方式,相对来说较安全。但如果需要持久化,则对服务器压力比较大
如果用Cookie实现方式,不够安全,且空间较小
针对以上情况,出现了JWT(Json Web Token)的认证方式
JWT 的原理
,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样:
{
"姓名": "张三",
"角色": "管理员",
"到期时间": "2018年7月1日0点0分"
}
以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。
服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。
JWT 的使用
在restframework中的使用
安装:pip install djangorestframework-jwt
配置:
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': ( #使用自带的认证组件
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
设置过期时间等等:
JWT_AUTH = { # 设置jwt的过期时间等等
'JWT_RESPONSE_PAYLOAD_HANDLER': 'common.utils.jwt_response_payload_handler',
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=3600), #设置过期时间60分钟
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_AUTH_HEADER_PREFIX': 'Token',
}