django-restframework文档接口及jwt验证(1)

安装依赖

djangorestframework及jwt安装

pip install djangorestframework
pip install djangorestframework-jwt

解决跨域

pip install django-cors-headers
INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework.authtoken',  # 设置token
    'corsheaders',  # 解决跨域问题
    ...
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    ...
]

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

JWT设置

JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),  
    # JWT_EXPIRATION_DELTA 指明token的有效期
    'JWT_AUTH_HEADER_PREFIX': 'Bearer',  # 默认 JWT
    # 自定义返回格式,需要手工创建
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'app.views.jwt_response_payload_handler',
    # JWT_RESPONSE_PAYLOAD_ERROR_HANDLER需要在库中手动设置
    'JWT_RESPONSE_PAYLOAD_ERROR_HANDLER': 'app.views.jwt_response_payload_error_handler',
}

JWT_RESPONSE_PAYLOAD_ERROR_HANDLER设置

错误返回函数

Django中jwt错误返回的是{“non_field_errors”:[“无法使用提供的认证信息登录。”]},当用户名或密码错误时,是不会去调用jwt_response_payload_handler,那么失败时调用的是什么函数了,JWT_RESPONSE_PAYLOAD_ERROR_HANDLER,但是发现这个方法并没有合到master分支,我们需要手动合并进去:

修改配置文件

我们打开用到的虚拟环境/python3.6/site-packages/rest_framework_jwt/settings.py在IMPORT_STRINGS中添加JWT_RESPONSE_PAYLOAD_ERROR_HANDLER:
在这里插入图片描述
在/python3.6/site-packages/rest_framework_jwt/views.py
在这里插入图片描述
在这里插入图片描述

修改使用JWT验证的URL

from rest_framework.documentation import include_docs_urls
from rest_framework_jwt.views import obtain_jwt_token
from django.conf.urls import url, include

urlpatterns = [
	url(r'^userController/login/', obtain_jwt_token),
	url(r'^', include_docs_urls("xxxxx")), # restframework文档接口
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), # restframework登录机制
]

登录验证

自定义登录成功返回的数据

JWT机制通过用户名密码,登录成功后默认返回的是token,一串加密的字符。但是我们需要返回用户的其他信息,就需要自定义,前面在JWT_AUTH 中设置了:

 'JWT_RESPONSE_PAYLOAD_HANDLER': 'app.views.jwt_response_payload_handler',

假设我们新建的app名字是users,需要改成:

 'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.views.jwt_response_payload_handler',

users目录下views.py:

def jwt_response_payload_handler(token, user=None, request=None):
    """
    登录成功后自定义返回
    :param token: jwt
    :param user: 当前登录用户
    :param request: 请求对象
    :return: 用户信息
    """
    try:
        rid = UsersRoles.objects.get(uid=user.id).rid  # 作者设计的model
        rnm = Roles.objects.get(rid=rid).rnm
        results = {
            "msg": "登录成功",
            "code": "200",
            "user": { },
            "jwt": token,
        }
        return {'data': results}

    except:
        results = {
            "msg": "认证失败",
            "code": "10001"
        }
        return {'data': results}

自定义登录失败返回的数据

我们已经设置了rest_framework_jwt中的代码,同上:

def jwt_response_payload_error_handler(serializer, request=None):
    results = {
        "msg": "用户名或者密码错误",
        "code": 401,
        "detail": serializer.errors
    }
    return {'data': results}

测试如下图:
在这里插入图片描述
在这里插入图片描述
如图登录成功会返回自定义的jwt,这个就是用来验证是否可以访问:
前端访问的时候需要加上headers:

headers: {
            'Authorization': 'Bearer ' + jwt 
        }

Bearer是前面settings里面可以自定义的,默认为JWT,要加空格,这样才能成功访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值