您的位置:首页 > Web前端 > Vue.js

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',  # 默认的
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: