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日

相关文章

  • 一键备份gitolite服务器的Shell脚本

    下面是“一键备份gitolite服务器的Shell脚本”的完整攻略: 1. 需求分析 gitolite是一款优秀的Git仓库管理工具,用于管理Git项目权限和访问。在使用gitolite时,我们需要对服务器进行备份以确保数据安全性。因此,需要编写一个Shell脚本,一键备份gitolite服务器。 2. 编写Shell脚本 2.1 确定备份目录和备份文件名称…

    人工智能概览 2023年5月25日
    00
  • 基于ChatGPT使用AI实现自然对话的原理分析

    ChatGPT是什么? ChatGPT是一种基于语言模型(Language Model,LM)的对话生成模型。原本是由OpenAI团队领导人Sam Altman在Twitter上发布的一份语言模型,后来被加以改进为面向对话的ChatGPT模型。目前,该模型的最新版本是GPT-3,它在自然语言处理(NLP)领域的表现极为出色。 ChatGPT如何实现自然对话?…

    人工智能概论 2023年5月25日
    00
  • Vue中的项目打包及部署全流程

    当我们使用Vue开发完毕一个项目后,需要对项目进行打包和部署。本文将介绍Vue中的项目打包及部署全流程,并提供两个示例。 打包项目 在Vue项目根目录下执行如下命令即可对项目进行打包: npm run build 执行完成后,我们可以在项目根目录下的dist目录下找到打包好的文件,其中包含一个HTML文件、一些CSS和JS文件以及其他所需的资源文件。 部署项…

    人工智能概览 2023年5月25日
    00
  • PyTorch 多GPU下模型的保存与加载(踩坑笔记)

    PyTorch是一个开放源码的机器学习库,支持多GPU并行计算。在使用多GPU训练模型时,保存和加载模型需要特别注意。下面是“PyTorch 多GPU下模型的保存与加载(踩坑笔记)”的攻略过程,具体包含以下几个步骤: 1. 引入必要的库 在保存和加载模型之前,我们需要引入必要的库来支持模型的保存和加载。 import torch from torch.nn.…

    人工智能概论 2023年5月25日
    00
  • Django request.META.get()获取不到header头的原因分析

    当我们在使用Django框架开发Web应用时,常常需要获取这个请求的Header头信息,比如User-Agent、Authorization等。而在Django中,可以用request.META.get()方法获取Header头。但是,很多人会遇到获取不到Header头信息的情况,这是为什么呢? 本文将分以下几点详细分析原因,并提供示例说明,帮助读者理解: …

    人工智能概览 2023年5月25日
    00
  • 浅析在线影视点播巨头Netflix的信息处理架构

    浅析在线影视点播巨头Netflix的信息处理架构 1. Netflix的信息处理架构概述 Netflix作为一家在线影视点播巨头,它的信息处理架构是非常复杂和先进的。简单来说,Netflix的信息处理架构可以分为以下几个层次: 数据采集层:Netflix通过各种方式采集用户行为数据,例如服务器日志、用户访问记录和设备数据等。 实时流处理层:Netflix使用…

    人工智能概览 2023年5月25日
    00
  • 详解将Django部署到Centos7全攻略

    下面我将详细讲解“详解将Django部署到CentOS7全攻略”的完整攻略。 1. 安装必要的软件包 要将Django部署到CentOS7,需要安装一些必要的软件包,包括Python、PIP、Git、Virtualenv、Nginx等等。具体安装过程如下: # 更新yum源 sudo yum -y update # 安装Python、PIP、Git sudo…

    人工智能概览 2023年5月25日
    00
  • Pycharm更换安装源与添加第三方库方法详解

    Pycharm是一个程序开发环境,可以帮助程序员更高效地进行Python编程。在使用过程中,有时需要更换安装源或添加第三方库,本文将详细介绍如何进行操作。 更换安装源 Pycharm的默认安装源为官方源,但有时需要更换其他源以提高下载速度或解决下载失败的问题。下面介绍两种更换安装源的方法。 方法一:通过设置修改安装源 步骤如下: 打开Pycharm,在菜单栏…

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