1.依赖
pip install djangorestframework-jwt
2.在settings.py中导入配置项
# DRF配置项
REST_FRAMEWORK = {
...
# 认证
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # JWT认证类 放在第一位是默认项
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
...
}
3.注册逻辑
3.1在serializers.py中,创建用户的时候给用户临时添加字段token,并且序列化出去
class CreateUserSerializer(serializers.ModelSerializer):
"""注册序列化器"""
...
token = serializers.CharField(label='token', read_only=True)
class Meta:
model = User # 从User模型中映射序列化器字段
fields = [...,'token',...]
...
def create(self, validated_data):
...
略
...
user = User(**validated_data)
...
user.save()
# 6.引用jwt中的叫jwt_payload_handler函数(生成payload)
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
# 7.函数引用 生成jwt
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
# 8.根据user生成用户相关的载荷
payload = jwt_payload_handler(user)
# 9.传入载荷生成完整的jwt
token = jwt_encode_handler(payload)
user.token = token
return user
3.2前端对token进行保存
每次发送请求的时候都必须携带token值进行校验
请求头:Authorization
值为:‘JWT’ +token
4.登录逻辑
使用jwt自带认证系统,内部任然调用django的认证系统,登录成功生成token
在urls.py中追加
urlpatterns = [
...
# JWT登录
# 内部认证代码还是Django 登录成功生成token
url(r'^authorizations/$', obtain_jwt_token),
...
]
5.jwt登陆成功后相应数据的修改
jwt登录成功后默认生成的响应数据只有token,如果要更改其相应数据,那么只需要修改JWT_RESPONSE_PAYLOAD_HANDLER指向的方法
在应用下新建utils.py,增加如下代码:
# 重写JWT登录视图的构造响应数据函数,多追加 user_id和username
def jwt_response_payload_handler(token, user=None, request=None):
"""重写JWT登录视图的构造响应数据函数,多追加 user_id和username"""
return {
'token': token,
'user_id': user.id,
'username': user.username
}
6.在settings.py中添加如下配置
JWT_AUTH = {
...
# 修改JWT登录视图的构造响应数据的函数
'JWT_RESPONSE_PAYLOAD_HANDLER': 'path.jwt_response_payload_handler',
...
}
7.jwt认证设置有效期
在JWT_AUTH追加配置
JWT_AUTH = {
...
# JWT有效期
# 过了有效期前端携带token发送给后认证将会不通过
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
...
}