Django RESTframework JWT验证使用

Django RESTframework JWT验证使用

我们在序列化器中验证完用户的身份后(检验用户名和密码),需要在create()方法中向用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT。

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

1、安装配置

安装

  pip install djangorestframework-jwt

配置

在全局的总配置文件进行配置

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

2、后端生成token

在注册成功后,连同返回token,修改序列化器,在create方法中增加手动创建token的方法。 一定要在用户创建完成,并且保存之后再创建token,否则jwt_payload_handler(user)方法会出现异常。

   # 补充生成记录登录状态的token
    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)
    user.token = token

3、前端保存token

后端生成的token,前端可以保存在cookie中,也可以保存在浏览器的本地存储里。
浏览器的本地存储提供了sessionStorage 和 localStorage 两种:

  • sessionStorage 浏览器关闭即失效
  • localStorage 长期有效

使用方法

sessionStorage.变量名 = 变量值 // 保存数据
sessionStorage.变量名 // 读取数据
sessionStorage.clear() // 清除所有sessionStorage保存的数据

localStorage.变量名 = 变量值 // 保存数据
localStorage.变量名 // 读取数据
localStorage.clear() // 清除所有localStorage保存的数据

示例:
localStorage.token = response.data.token;

4、前端使用验证

当某一个功能需要对用户的身份进行验证时,需要在请求中添加token字段。
一般是在请求头里加入Authorization,并加上Bearer标注:

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

5、后端使用验证

Django REST framework JWT提供了登录签发JWT的视图,可以直接使用

from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
  	url(r'^“此处为访问路由”/$', obtain_jwt_token),
]

默认的返回值仅有token,如果返回值中还需要有其他字段,通过修改该视图的返回值可以完成对应的需求

def jwt_response_payload_handler(token, user=None, request=None):
"""
自定义jwt认证成功返回数据
"""
return {
    'token': token,
    'user_id': user.id,  # 自定义字段1
    'username': user.username  # 自定义字段2
}
# JWT

修改配置文件

JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django REST framework (DRF) 可以使用 Token 认证、Session 认证和 JSON Web Token (JWT) 认证等方式进行登录验证。 其中,Token 认证和 Session 认证是最基本的认证方式,它们都使用Django 自带的用户认证系统,适合于简单的应用场景。Token 认证是通过在请求头中添加 Token 来进行认证,而 Session 认证则是在 Cookie 中保存 Session ID 来进行认证。 JWT 认证则是一种更加灵活和安全的认证方式,它使用了基于 JSON 的 Token,可以完全脱离 Django 自带的用户认证系统,支持跨域访问和分布式系统。JWT 认证需要在 DRF 中添加相应的中间件和配置,同时也需要在前端实现 Token 的生成和保存。 在 DRF 中使用 Token 认证或 Session 认证,只需要在 settings.py 文件中添加相应的认证方式,如: ```python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ], } ``` 在视图函数中使用 `@authentication_classes` 装饰器来指定认证方式,如: ```python from rest_framework.decorators import authentication_classes from rest_framework.authentication import TokenAuthentication, SessionAuthentication @authentication_classes([TokenAuthentication, SessionAuthentication]) @api_view(['GET']) def my_view(request): # ... ``` JWT 认证需要使用第三方库 `djangorestframework-jwt`,并在 settings.py 文件中添加相应的配置,如: ```python INSTALLED_APPS = [ # ... 'rest_framework', 'rest_framework_jwt', ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), } JWT_AUTH = { 'JWT_SECRET_KEY': 'your_secret_key', 'JWT_ALGORITHM': 'HS256', 'JWT_ALLOW_REFRESH': True, 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=30), } ``` 在视图函数中使用 `@jwt_authetication_classes` 装饰器来指定 JWT 认证方式,如: ```python from rest_framework_jwt.authentication import JSONWebTokenAuthentication from rest_framework.decorators import jwt_authetication_classes @jwt_authetication_classes([JSONWebTokenAuthentication]) @api_view(['GET']) def my_view(request): # ... ``` 以上是 DRF 中常见的登录验证方式,可以根据具体的应用场景选择合适的认证方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值