jwt token
jwt使用配置:
settings文件中添加:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
REST_FRAMEWORK = { # 异常处理 自定义的异常处理类 'EXCEPTION_HANDLER': 'drf_meiduo.utils.exceptions.exception_handler', 'DEFAULT_AUTHENTICATION_CLASSES': ( # 引入JWT认证机制 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), } JWT_AUTH = { #设置jwt的有效时间 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import logging from rest_framework.views import exception_handler as drf_exception_handler from rest_framework.response import Response from rest_framework import status from django.db import DatabaseError from redis.exceptions import RedisError # 获取在配置文件中定义的logger,用来记录日志 logger = logging.getLogger('django') def exception_handler(exc, context): """ 自定义异常处理 :param exc: 异常 :param context: 抛出异常的上下文 :return: Response响应对象 """ # 调用drf框架原生的异常处理方法 response = drf_exception_handler(exc, context) if response is None: # 获取异常视图对象 view = context['view'] if isinstance(exc, DatabaseError) or isinstance(exc, RedisError): # 数据库异常 logger.error('[%s] %s' % (view, type(exc))) response = Response({'message': '服务器内部错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) return response
示例代码:django-restframework已经封装好了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Django REST framework JWT提供了登录签发JWT的视图,可以直接使用 from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ url(r'^authorizations/$', obtain_jwt_token), ] 注:默认JWT扩展登录视图的返回值仅有token,我们还需在返回值中增加username和user_id。 3. 自定义JWT扩展登录视图响应数据函数 1)在users/utils.py 中,创建 def jwt_response_payload_handler(token, user=None, request=None): """ 自定义jwt认证成功返回数据 """ return { 'token': token, 'user_id': user.id, 'username': user.username } 2)修改配置文件 # JWT扩展配置 JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), 'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler', }
1 ,session 认证机制:
1,用户登录,传递用户名和密码给客户端 2,服务器进行用户名和密码的校验,如果校验成功,将用户保存到session 3,将sessionid通过cookie返回给客服端,客服端会保存sessionID 4,客服端再次访问服务器,会携带cookie:sessionID ,服务端就可以获取对应的session信息,然后对用户的身份进行校验
session认证存在的问题:
1,session 信息存放在服务器端,如果用户过多,就占用过多的服务器的存储空间
2,session 依赖于cookie,如果cookie被截获,可能产生csrf跨站请求伪造
3,在分布式网站应用中,如果session存储到服务器的内存,session共享会用问题
2 ,jwt 认证机制
jwt token 组成:
字符串,由头部(header),载荷(payload)和签名(signatrue)3部分组成,用.隔开(点号)
1,头部(header):存储的是token类型和签名加密的算法
{‘token类型’,‘签名加密算法’} 对头部内容使用base64进行加密,生成的就是header
2,载荷(payload):存储有效的数据和token的有效时间
{"user_id": "用户id",
"username": "用户名"
"mobile": "15211111111"
...
"exp": "token有效时间"}
对载荷内容进行base64加密,生成的内容就是payload
3,签名(signature):作用:防止jwt token 被伪造
-
payload载荷不要存过于敏感数据
-
服务器需要保存好签名加密密钥
-
可以使用安全网络协议:https
jwt扩展使用:
功能:生成jwt token和校验jwt token