Django JWT Token RestfulAPI用户认证详解

Django JWT Token RestfulAPI 用户认证详解

什么是JWT?

JWT(Json Web Token)是一种用于进行跨网络访问的通信协议,它拥有最重要的功能:保证其所有信息都是由可信解析方发布的。JWT由三部分组成:Header、Payload和Signature。

  • Header: 包含加密算法、令牌类型等。
  • Payload: 包含需要传递的数据,一般有用户信息和过期时间等。
  • Signature: 由前两部分以及密钥组成的字符串,用来校验数据的完整性。

JWT使用起来非常方便,具有无状态、可扩展、松散耦合等优点,因此被越来越多的Web开发人员所使用。

JWT在Django中的应用

Django Rest Framework是一个强大的API框架,支持使用JWT进行用户认证。接下来将为大家详细介绍如何在Django中使用JWT进行RestfulAPI用户认证。

安装Django Rest Framework和PyJWT:

pip install djangorestframework
pip install pyjwt

创建Django项目和应用

#创建Django项目
django-admin startproject mysite

#创建Django应用
python manage.py startapp myapp

配置settings.py文件

INSTALLED_APPS中添加rest_frameworkmyapp

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'rest_framework',
    'myapp',
]

在settings.py文件底部添加以下配置:

# JWT配置
JWT_AUTH = {
    'JWT_SECRET_KEY': 'mysecretkey',
    'JWT_ALGORITHM': 'HS256',
    'JWT_ALLOW_REFRESH': True,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7)
}

这里配置了JWT_SECRET_KEY、JWT_ALGORITHM和JWT_EXPIRATION_DELTA等参数,用于对Token进行加密、验证和过期时间的控制。

编写代码

我们在myapp的views.py文件中编写登陆和获取用户信息的代码:

from django.contrib.auth.models import User
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework_jwt.settings import api_settings
from rest_framework_jwt.views import ObtainJSONWebToken
from rest_framework_jwt.views import RefreshJSONWebToken

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER


class LoginView(ObtainJSONWebToken):
    def post(self, request, *args, **kwargs):
        result = super(LoginView, self).post(request, *args, **kwargs)
        token = result.data['token']
        payload = jwt_payload_handler(User.objects.get(username=request.data['username']))
        return Response({
            'token': token,
            'user': {
                'id': str(payload['user_id']),
                'username': payload['username'],
            }
        })


class RefreshJSONWebTokenView(RefreshJSONWebToken):
    authentication_classes = (JSONWebTokenAuthentication,)

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            new_token, _ = serializer.object.get('token', '')
            payload = jwt_payload_handler(User.objects.get(username=request.user.username))
            return Response({
                'token': new_token,
                'user': {
                    'id': str(payload['user_id']),
                    'username': payload['username'],
                }
            })

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

注意,这里使用了rest_framework_jwt.authentication.JSONWebTokenAuthentication来控制访问权限。对于JRWT的Auth认证,它会首先匹配一个用户,然后再校验JWT完整性。这样可以有效地控制Web应用程序的访问权限。

创建路由

我们需要在myapp的urls.py文件中创建路由:

from django.urls import path
from rest_framework_jwt.views import RefreshJSONWebToken
from myapp.views import LoginView

urlpatterns = [
    path('auth/login/', LoginView.as_view(), name='login'),
    path('auth/token-refresh/', RefreshJSONWebToken.as_view(), name='token-refresh'),
]

示例

下面是两个示例,展示如何使用JWT进行用户身份验证:

登录

访问/auth/login/ URL接口,使用POST方法发送用户的用户名和密码请求Token:

POST /auth/login/ HTTP/1.1
Host: mysite.com
Content-Type: application/json

{"username": "test", "password": "123123"}

结果响应如下:

HTTP/1.1 200 OK
Content-Type: application/json

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InRlc3QiLCJleHAiOjE2MDMyMzM2MTksImVtYWlsIjoidGVzdEB0ZXN0LmNvbSJ9.QFkC9Oc7rYnAkSZH-07j4O26Ds4Qzn6lrY_ehnGDb3M",
    "user": {
        "id": "1",
        "username": "test"
    }
}

获取用户信息

访问URL接口,使用GET方法查询用户信息:

GET http://mysite.com/api/userinfo/ HTTP/1.1
Authorization: JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InRlc3QiLCJleHAiOjE2MDMyMzM2MTksImVtYWlsIjoidGVzdEB0ZXN0LmNvbSJ9.QFkC9Oc7rYnAkSZH-07j4O26Ds4Qzn6lrY_ehnGDb3M

结果响应如下:

HTTP/1.1 200 OK
Content-Type: application/json

{
    "id": "1",
    "username": "test"
}

总结

以上就是JWT在Django中的应用过程,通过以上的示例可以发现使用JWT进行用户认证非常方便和安全。同时,Django Rest Framework也是一个强大的API框架,可以轻松构建出强大的RestfulAPI服务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django JWT Token RestfulAPI用户认证详解 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • TensorFlow获取加载模型中的全部张量名称代码

    获取加载模型中的全部张量名称是TensorFlow常见的操作之一,下面是我为你整理的一份详细攻略: 1. 直接使用tf.GraphKeys TensorFlow提供了tf.GraphKeys集合来组织模型中的各种张量名称,使用tf.get_collection()函数即可获取集合中的所有张量名称。代码如下: import tensorflow as tf #…

    人工智能概论 2023年5月25日
    00
  • Python OpenCV实现3种滤镜效果实例

    关于“Python OpenCV实现3种滤镜效果实例”的完整攻略,我会提供以下几个方面的说明: 1. 准备工作 在开始本项目之前,我们需要先进行一些准备工作: 安装Python 安装OpenCV库 下载示例图片 可以参考以下链接安装Python和OpenCV库: Python安装教程 OpenCV库安装教程 示例图片可以在 GitHub仓库 中下载。 2. …

    人工智能概论 2023年5月25日
    00
  • VUE开发分布式医疗挂号系统的医院设置页面步骤

    下面我将详细讲解VUE开发分布式医疗挂号系统的医院设置页面步骤。 第一步:创建医院设置页面组件 首先,在VUE项目中创建医院设置页面组件,可以使用以下命令创建: vue create hospital-setting-page 创建成功后,进入项目根目录,找到 src/components 目录,在该目录下新建一个名为 HospitalSetting 的组件…

    人工智能概览 2023年5月25日
    00
  • python简单几步实现时间日期处理到数据文件的读写

    下面将详细讲解使用 Python 实现时间日期处理到数据文件的读写的完整攻略。 步骤1:引入依赖 在 Python 中处理时间日期,我们需要用到 Python 标准库中的 datetime 模块和 time 模块,所以我们首先需要在 Python 代码中引入这两个模块。 import datetime import time 步骤2:处理时间日期 我们可以用…

    人工智能概论 2023年5月24日
    00
  • 如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)

    关于如何将 TensorFlow 训练好的模型移植到 Android 上,我将分以下几个步骤进行介绍: 导出模型 在使用 TensorFlow 进行模型训练并完成后,需要将模型导出,以便在 Android 上进行使用。导出模型时,需要定义保存路径和需要导出的节点信息,示例代码如下: from tensorflow.python.framework impor…

    人工智能概论 2023年5月24日
    00
  • 基于pytorch 预训练的词向量用法详解

    基于PyTorch预训练的词向量用法详解 简介 词向量是自然语言处理(NLP)领域中非常有用的一种技术,它可以将单词转换为向量,从而方便计算机进行处理。在PyTorch中,我们可以使用预训练的词向量,而不必从头开始训练。本文将介绍如何使用PyTorch预训练的词向量。 步骤 下载预训练的词向量 首先,我们需要从官方网站中下载要使用的预训练词向量。 加载预训练…

    人工智能概论 2023年5月25日
    00
  • Python中整数的缓存机制讲解

    Python中整数的缓存机制讲解 在Python中,整数有一个缓存机制,即-5到256之间的整数会被缓存,而其他的整数则不会被缓存。在使用整数时,如果两个整数的值相同,则它们实际上可能会指向同一个对象,而不是两个不同的对象。 整数缓存机制的实现原理 Python中整数的缓存机制通过小整数对象池实现,也就是说,Python会在解释器启动时创建一系列小整数对象(…

    人工智能概览 2023年5月25日
    00
  • 谈谈Redis分布式锁的正确实现方法

    谈谈Redis分布式锁的正确实现方法 在分布式系统中,为了避免因为多个线程同时对同一个资源进行写操作而出现的数据竞争问题,我们需要对关键代码段进行加锁,以保证在同一时间内只有一个线程对资源进行写操作。Redis作为一种高性能、高可用、可扩展的非关系型数据库,其分布式锁的实现也备受关注。 Redis分布式锁的基本原理 Redis分布式锁的基本原理是:当多个客户…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部