美文网首页
Django REST framework JWT

Django REST framework JWT

作者: NameJaho | 来源:发表于2018-07-12 18:32 被阅读0次

    前言:在Django项目中,在JWT介绍的文章中说到,要保存用户的登陆状态时,我们需要用到Session或者JWT机制来实现,本文中我们是基于 Json Web Token 机制来实现这一功能的。

    在用户注册模块中,对用户的用户名和密码的检验之后,我们需要对用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT。

    关于签发和核验JWT,我们可以使用Django REST framework JWT扩展来完成。

    1. 安装

    pip install djangorestframework-jwt

    2. 配置

    ​
    REST_FRAMEWORK = {
     'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
     'rest_framework.authentication.SessionAuthentication',
     'rest_framework.authentication.BasicAuthentication',
     ),
    }
    ​
    JWT_AUTH = {
     # 指明token的有效期
     'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    }
    

    3. 后端使用(手动签发)

    from rest_framework_jwt.settings import api_settings
    ​
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    ​
    payload = jwt_payload_handler(user)
    token = jwt_encode_handler(payload)
    ​
    # 需将token赋予user
    user.token = token
    ​
    # 关键源码
    def jwt_payload_handler(user):
     ...
     payload = {
     'user_id': user.pk,
     'username': username,
     'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA
     }
     if hasattr(user, 'email'):
     payload['email'] = user.email
     if isinstance(user.pk, uuid.UUID):
     payload['user_id'] = str(user.pk)
      ...  
    

    4. 登录签发视图

    Django REST framework JWT提供了登录签发JWT的视图,在验证用户名密码时调用了Django中的authenticate方法校验用户名密码的,如需自定义认证 可以重写authenticate方法 需继承 django.contrib.auth.backends.ModelBackend

    默认返回token,可自定义返回

    urls.py
    from rest_framework_jwt.views import obtain_jwt_token
    ​
    urlpatterns = [
     url(r'^authorizations/>, obtain_jwt_token),
    ]
    ​
    utils.py
    def jwt_response_payload_handler(token, user=None, request=None):
     """
     自定义jwt认证成功返回数据
     """
     return {
     'token': token,
     'user_id': user.id,
     'username': user.username
     }
    # 修改配置
    # JWT
    JWT_AUTH = {
        'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),       
        'JWT_RESPONSE_PAYLOAD_HANDLER':'users.utils.jwt_response_payload_handler',
    }
    

    5. 前端保存token

    我们可以将JWT保存在cookie中,也可以保存在浏览器的本地存储里,我们保存在浏览器本地存储中,浏览器的本地存储提供了sessionStorage 和 localStorage 两种:

    --> sessionStorage 浏览器关闭即失效

    --> localStorage 长期有效

    // 记住用户状态
    ​
    sessionStorage.变量名 = 变量值   // 保存数据
    sessionStorage.变量名  // 读取数据
    sessionStorage.clear()  // 清除所有sessionStorage保存的数据
    ​
    localStorage.变量名 = 变量值   // 保存数据
    localStorage.变量名  // 读取数据
    localStorage.clear()  // 清除所有localStorage保存的数据
    

    如若有误,欢迎指出,感谢!

    相关文章

      网友评论

          本文标题:Django REST framework JWT

          本文链接:https://www.haomeiwen.com/subject/dgirpftx.html