1.什么是JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录场景。JWT一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从服务器获取资源,也可以增加一些额外的其它业务逻辑的声明信息。
2.session会话保持及存在的问题
3.JWT会话保持的流程
2.djangorestframework-jwt框架1.安装
pip install djangorestframework-jwt
2.配置全局的jwt认证
#配置jwt的全局认证
REST_FRAMEWORK = {
# 身份认证
'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_jwt.authentication.JSONWebTokenAuthentication'],
}
from datetime import timedelta
JWT_AUTH = {
# jwt过期时间
'JWT_EXPIRATION_DELTA': timedelta(days=1),
}
3.登录的使用
4.管理员登录
#重写authenticate实现管理员登录
class MyAuthentication(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
#查询用户对象
user= Users.objects.filter(models.Q(username=username) |models.Q(phone=username)).first()
#判断用户 /密码 /是否是管理员
if user and check_password(password,user.password) and user.is_staff :
return user
else:
return None
5.在settings.py中配置
JWT_AUTH = {
# jwt过期时间
'JWT_EXPIRATION_DELTA': timedelta(days=1),
# 自定义返回数据
'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}
6.配置settings.py中的==django认证==
#配置django的认证
AUTHENTICATION_BACKENDS= [
'users.utils.MyAuthentication'
]
7.配置登录路由
from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('login/', obtain_jwt_token),
]
3.短信验证码
1.容联云地址:容联云通讯_短信平台、手机验证码、语音验证码、IM即时通讯、云呼叫系统等互联网通信服务
2.账号注册成功以后,系统分配授权信息
3.添加测试号码
3.5 在Settings.py中配置容联云 账号信息
#配置容联云 账号信息 ACCID='8a216da8804ba8a5018064a09f03065f' ACCTOKEN='6647b67a52b74fe4be11961110d24470' APPID='8a216da8804ba8a5018064a09fe60666'
4.安装SDK
pip install ronglian_sms_sdk
5.在utils.py中写代码
#发送短信
def send_message(sms_code,mobile,expire=5):
#实例化sdk
sdk=SmsSDK(settings.ACCID,settings.ACCTOKEN,settings.APPID)
#组织数据
tid='1' #短信模板
mobile='%s'%mobile #手机号转换为字符串
datas=('%s'%sms_code,'%s'%expire) #手机验证码
#发送短信,并解析响应
res = sdk.sendMessage(tid=tid,mobile=mobile,datas=datas)
#解析响应
print('发送短信的响应',res,type(res))
res_dict = json.loads(res)
if res_dict.get('statusCode') == '000000':
return True
else:
return False
6.定义路由
#短信验证码
path('sms_code/',views.MaaAPIVew.as_view()),
7.发送短信的视图
#发送短信的视图
class MaaAPIVew(APIView):
def post(self,request):
#1. 接收前端传来的数据
mobile=request.data.get('mobile')
uuid=request.data.get('uuid')
# 2. 生成短信验证码
sms_code="%d"%random.randint(100000,999999)
#存储短信验证码
redis_conn=redis.Redis(host='localhost',port=6379,db=3)
redis_conn.set(uuid,sms_code,ex=300)
#3. 请求容联云发送短信
res=send_message(sms_code,mobile)
if res:
return Response({'code':200,'msg':'发送短信成功'})
else:
return Response({'code':400,'error':'发送失败'})
4.验证短信验证码
1.配置路由
from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token
from . import views
urlpatterns = [
#验证短信验证码
path('phone_verify/',views.SmsAPIVew.as_view()),
]
3.验证短信验证码视图 失去焦点触发
#验证短信验证码
class SmsAPIVew(APIView):
def post(self,request):
#接收前端数据
sms_code=request.data.get('sms_code')
uuid_=request.data.get('code_id')
#查询redis 拿出存储的短信验证码
redis_conn=redis.Redis(host='localhost',port=6379,db=3)
stored_sms_code=redis_conn.get(uuid_)
#判断
if stored_sms_code and stored_sms_code.decode() ==sms_code:
return Response({'code':200,'msg':'对比成功'})
else:
return Response({'code':400,'error':'对比失败'})
完成登录
今日报错马虎大意了把jwt全局认证给写错了,以后不要再马虎大意了
#配置jwt的全局认证
REST_FRAMEWORK = {
# 身份认证
'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_jwt.authentication.JSONWebTokenAuthentication'],
}



