Django Rest Framework 电商项目 7-6 Vue和JWT接口调试和django自定义用户验证
2019-02-14 21:59
1771 查看
首先解决一个bug,在api.js中找到登录功能(之前说过,所有接口都在api.js中),发现前端向服务器POST的url是login,而不是jwt-token-auth,我们修改后端的url配置。将urls.py中的:
[code]url(r'^jwt-token-auth/', obtain_jwt_token),
改为:
[code]url(r'^login/', obtain_jwt_token),
再看src/views/login/login.vue中的逻辑:
[code]login(){ var that = this; login({ username:this.userName, // 使用用户名和密码进行一个POST请求 password:this.parseWord // 这个login就是上面提到的login }).then((response)=> { console.log(response); //本地存储用户信息 cookie.setCookie('name',this.userName,7); // 过期时间为7天 cookie.setCookie('token',response.data.token,7) // 把name和token放进来了 // 存储在store // 更新store数据 that.$store.dispatch('setInfo'); // 将user和token取出放到state中,很多地方都是取得这个组件,故而前端登录状态会实时更新 //跳转到首页页面 this.$router.push({ name: 'index'}) }) .catch(function (error) { if("non_field_errors" in error){ that.error = error.non_field_errors[0]; } if("username" in error){ that.userNameError = error.username[0]; } if("password" in error){ that.parseWordError = error.password[0]; } }); },
这样,登录就完成了。
还有一个问题,url配置的login的类是obtain_jwt_token,它里面调用的是django的认证方法,就是用户名和密码过来之后,后端是如何知道用户名和密码是有效的的相关认证。那么我们今后使用手机号登录是不会成功的,因为默认是使用username和passwork进行查询。所以我们需要自定义django的用户认证函数。
首先在settings.py中设置一个变量:
[code]AUTHENTICATION_BACKENDS = ( 'users.views.CustomBackend', )
然后完成这个类,在uesrs/views.py中写:
[code]class CustomBackend(ModelBackend): """ 自定义用户验证 继承这个类,然后重写authenticate方法 """ def authenticate(self, username=None, password=None, **kwargs): # 然后重写这个函数 try: user = User.objects.get(Q(username=username)|Q(mobile=username)) # 查询用户方式增加了mobile,原本只有username if user.check_password(password): # 仍然是通过password验证用户,check_password会对传过来的password(名文)进行加密,然后比对 return user except Exception as e: return None
引入:
[code]from django.contrib.auth.backends import ModelBackend from django.contrib.auth import get_user_model from django.db.models import Q
获取用户信息类:
[code]User = get_user_model()
完成之后,我们可以打个断点看看登陆的时候是否跳转到这个地方。
用postman,向:
[code]http://127.0.0.1:8000/login/
发送请求,内容为:
[code]{ "username": "用户名", "password": "密码" }
POST一下,发现成功调用了。F6下一步看到成功进行了password的比对,F8看到postman中,成功返回了Token。
这样我们就完成了自定义的验证。
再看看jwt的文档,实际上它是有很多设置的。如过期时间。如何设置呢?
需要在settings.py中配置全局变量JWT_AUTH,并加入相关配置:
[code]import datetime JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), # 过期时间 'JWT_AUTH_HEADER_PREFIX': 'JWT', # 默认的 }
相关文章推荐
- Django Rest Framework 电商项目 8-3 用户收藏接口实现
- Django Rest Framework 电商项目 7-8 DRF实现发送短信验证码接口
- Django Rest Framework 电商项目 8-4 DRF的权限验证
- Django Rest Framework 电商项目 7-9 user serializer和validator验证
- Django Rest Framework 电商项目 8-5 用户收藏功能与Vue联调
- Django Rest Framework 电商项目 7-11 Vue和注册功能联调
- django项目培训站-17-用户登陆-自定义用户验证方式-错误提示信息传前端
- Django Rest Framework 电商项目 8-2 热卖商品接口实现
- django项目培训站-04-自定义用户表继承系统默认用户表
- Django Rest Framework 电商项目 7-10 Django信号量实现密码的加密保存
- Django Rest Framework 电商项目 7-7 云片网发送短信验证码
- DJANGO1.6中自定义用户身份验证功能的教程[附源码]
- Django 博客项目02 Form验证+ 上传头像(预览)+Ajax用户注册
- Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步
- Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在
- Django商城项目笔记No.8用户部分-注册接口实现
- 【备忘】[全栈开发 ]Vue+Django REST framework 打造生鲜电商项目视频教程
- 2017.7.3 慕课网-Java从零打造企业级电商项目实战:for2 用户模块接口设计
- 使用jwt实现restful接口用户验证
- django创建虚拟环境、自定义用户、用户拦截以及项目的搭建