首页 > 其他分享 >Django项目中使用JWT身份验证

Django项目中使用JWT身份验证

时间:2024-02-29 17:15:43浏览次数:28  
标签:验证 jwt JWT 身份验证 用户 framework 服务器 Django

一、什么是JWT

JWT,全称是JSON Web Token,是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在多方之间安全地传输JSON格式的信息。这些信息可以被验证和信任,因为它们是数字签名的。JWT由三部分组成:头部(Header)、负载(Payload)、签名(Signature),每部分之间以.分隔。

JWT最常见的使用场景是缓存当前用户登录信息,用于认证和数据交换。在用户注册或登录后,JWT可以用来记录用户的登录状态或为用户创建身份认证的凭证。当用户登录成功之后,服务器会发放一个JWT给客户端,客户端之后的每一个请求在请求头携带上Authorization字段,以此来辨别区分请求的用户信息。

此外,JWT还支持使用HMAC算法或者是RSA的公私密钥对进行签名,因此它可以被用于安全地传递信息。由于JWT的这些特性,它特别适用于分布式站点的单点登录(SSO)场景,以及在网络应用环境间传递声明时执行基于JSON的开放标准。

二、JWT(JSON Web Token)身份验证的实现过程

  1. 用户登录:客户端(如Web浏览器或移动应用)发送用户名和密码到服务器进行登录请求。这一过程通常通过HTTPS协议进行,以确保信息传输的安全性。
  2. 服务器验证:服务器收到登录请求后,会核对用户名和密码。如果验证成功,服务器将生成一个JWT。这个JWT包含用户的一些信息(如用户ID等)和一个有效期。此外,JWT还包含一些其他的信息,如发行者、受众、签名算法等。
  3. 签发JWT:服务器将JWT的负载(Payload)和头部(Header)分别进行Base64编码,然后将它们拼接在一起,并使用一个密钥进行签名。这个签名用于验证JWT的真实性和完整性。最后,服务器将编码后的JWT返回给客户端。
  4. 客户端存储JWT:客户端收到JWT后,通常会将其存储在本地,如localStorage或sessionStorage。这样,在后续的请求中,客户端就可以使用这个JWT来证明自己的身份。
  5. 发送请求:当客户端需要向服务器发送请求时,它会在请求头中的Authorization字段中添加JWT。这样,服务器就能知道这个请求是来自哪个用户。
  6. 服务器验证JWT:服务器收到请求后,会提取出JWT,并验证其签名和有效期。如果验证通过,服务器就会处理这个请求,否则,它会拒绝这个请求。
  7. 处理请求:如果JWT验证通过,服务器会根据JWT中的用户信息来执行相应的操作,如查询数据库、更新数据等,然后返回结果给客户端。

这就是JWT身份验证的基本实现过程。通过使用JWT,服务器可以方便地验证用户的身份,并控制用户对资源的访问权限。同时,由于JWT是存储在客户端的,所以它可以减少服务器的存储压力,提高系统的性能。

三、JWT(JSON Web Token)的格式

JWT(JSON Web Token)的格式通常由三部分组成,它们由点(.)分隔。这三部分分别是:

  1. Header(头部):头部通常包含JWT的类型(即JWT)和所使用的签名算法(如HMAC SHA256或RSA)。这部分使用Base64Url编码。

  2. Payload(负载):负载包含声明(Claims),这些声明是关于实体(通常是用户)和其他数据的声明。声明是JWT的主体内容,可以包含各种信息,如用户ID、用户名、角色、过期时间等。这些声明也使用Base64Url编码。

  3. Signature(签名):签名是对头部和负载的签名,以确保JWT的真实性和完整性。签名使用在头部中指定的签名算法和密钥进行生成。

    因此,一个典型的JWT格式如下:
    <Base64Url(Header)>.<Base64Url(Payload)>.<Signature>
    例如:
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.e3M-sJf6w25w5z0e_S2dQ7qM8OAPeJ65XkZ22-Y4eM
    

四、Django使用JWT身份验证

在Django中,可以使用第三方库如 django-rest-framework-jwtPyJWT 来实现 JWT 认证。以下是如何在Django项目中使用 JWT 的基本步骤:

  1. 安装第三方库
    首先,你需要安装支持 JWT 的库。对于 Django REST framework,你可以使用 django-rest-framework-jwt

    pip install djangorestframework-jwt
    
  2. 配置 JWT
    在你的 Django 项目的设置文件(settings.py)中,你需要添加 JWT 的配置。

    INSTALLED_APPS = [  
        # ...  
        'rest_framework',  
        'rest_framework_jwt',  
        # ...  
    ]  
    
    REST_FRAMEWORK = {  
        'DEFAULT_AUTHENTICATION_CLASSES': [  
            'rest_framework_jwt.authentication.JSONWebTokenAuthentication',  
            # ... other authentication classes  
        ],  
    }  
    
    JWT_AUTH = {  
        'JWT_SECRET_KEY': 'your-secret-key',  # Should be a random string  
        'JWT_GET_USER_SECRET_KEY': None,  
        'JWT_PUBLIC_KEY': None,  
        'JWT_PRIVATE_KEY': None,  
        'JWT_ALGORITHM': 'HS256',  
        'JWT_ALLOW_REFRESH': True,  
        # ... other configurations  
    }
    

    3.创建和验证 Tokens
    使用 django-rest-framework-jwt 提供的视图,你可以很容易地创建和验证 JWT。

from rest_framework_jwt.views import obtain_jwt_token  

# Obtain the token  
token = obtain_jwt_token(request)

为了验证 token,你可以使用 django-rest-framework-jwt 提供的装饰器或中间件。

4.自定义 Token 生成和验证
如果你需要更细粒度的控制,可以自定义 token 的生成和验证过程。PyJWT 库可以帮助你手动生成和验证 tokens。

5.保护你的 API 端点
一旦配置了 JWT 认证,你可以使用 Django REST framework 的权限类来确保只有经过验证的用户才能访问特定的 API 端点。

from rest_framework.permissions import IsAuthenticated  

class MyView(APIView):  
    permission_classes = [IsAuthenticated]  
      
    def get(self, request, format=None):  
        # Only authenticated users can access this endpoint  
        content = {"message": "Hello, you're authenticated!"}  
        return Response(content)

6.处理用户登录和注销
你需要实现用户登录和注销的逻辑,以便在用户成功登录时生成 token,并在用户注销时使其失效。

标签:验证,jwt,JWT,身份验证,用户,framework,服务器,Django
From: https://www.cnblogs.com/chenxdnote/p/18044785

相关文章

  • 如何使用 vscode 搭建 Django Restful API 开发环境 All In One
    如何使用vscode搭建DjangoRestfulAPI开发环境AllInOnevscode+Django(Python)demos(......
  • 使用 Python 的 Django 框架开发一套 Web API 项目 All In One
    使用Python的Django框架开发一套WebAPI项目AllInOne游戏广告WebAPIDjango项目vsDjango应用程序一个Project可以包含多个Appsporject是一个可以独立运行的软件包app的运行必须依赖projectapp可以作为可以复用的功能模块使用demosDRF,DjangoR......
  • FastAPI系列:jwt认证
    jwt认证1.头部Header,主要是对jwt元数据的描述{'alg':'HS256','typ':'JWT'}2.载荷playload,主要包含jwt信息需要传递的主体数据{'iss':'jack',#由jwt签发'sub':'jack',#该jwt面向的用户组,也称为主题......
  • 1-Django框架简介以及基本操作
    安装注意:安装的磁盘目录,以及后续通过Django创建目录的时候,不要出现中文,否则会出现预料之外的错误建议:禁止套娃,即不要在A项目中创建B项目#如果不指定版本号,默认最新版pipinstalldjango#如果要指定版本,使用==版本号pipinstalldjango==3.2.12查看是否安装成功可......
  • 云服务器转发动态请求(uwsgi+django项目)
    路飞后台部署本地操作上线前配置prod.py:上线的配置文件,内容拷贝dev.py,前身就是settings.py#关闭测试环境DEBUG=FalseALLOWED_HOSTS=['39.99.192.127'#公网ip地址]CORS_ORIGIN_ALLOW_ALL=True#允许所有跨域#静态文件配置:上线后还有额外配置,见下方......
  • 【Django开发】0到1开发美多shop项目:用户登录模块开发。全md文档笔记(附代码 文档)
    本系列文章md笔记(已分享)主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目(4.0版本)含代码和文档。功能包括前后端不分离,方便SEO。采用Django+Jinja2模板引擎+Vue.js实现前后端逻辑,Nginx服务器(反向代理)Nginx服务器(静态首页、商品详情页、uwsg......
  • django如何将视图的数据表下载下来?(包括数据过滤)
    思路关键:django的视图本身返回的是json数据,而pandas本身就可以对json数据形成excel输出。所以,现在的关键是如何拿到需要的json数据?突破点:filterset还是serializers,都是可以支持手动使用的。defgenerate_queryset_excel(queryset,filterset_cls,serializer_cls,request=None......
  • Python Django适配dm8(达梦)数据库
    官方文档https://eco.dameng.com/document/dm/zh-cn/start/python-development.htmlDjango适配达梦https://blog.csdn.net/qq_35349982/article/details/132165581https://blog.csdn.net/weixin_61894388/article/details/126330168项目适配达梦升级或安装依赖Django==3......
  • .Net 6 WebAPI 使用JWT进行 授权认证配置
    .Net6WebAPI使用JWT进行授权认证1、安装组件(Nuget)Microsoft.AspNetCore.Authentication.JwtBearer2、Program.cs配置//授权认证(使用JWT)builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o=>{//私钥varsecretByte=Enco......
  • JWT(Token令牌)整合 SpringBoot
     前言:JWT(JSONWebToken)可以被称为令牌(token)。JWT是一种在网络应用中广泛使用的令牌格式,用于在用户和服务器之间传递安全可靠的信息。JWT通常包含了用户的身份信息和一些其他的元数据,被用作身份验证和授权。因此,人们经常将JWT简称为令牌(token)。 代码整合:1.导......