在Django中使用JSON Web Token(JWT)进行身份验证

2023-04-11 00:00:00 django json 身份验证

JSON Web Token(JWT)是一款基于JSON的轻量级身份验证协议,可以用于跨域身份验证,即使用户在多个不同的域中使用同一个身份认证。

在Django中使用JWT进行身份验证,你需要使用一些工具库来处理JWT相关的逻辑。这里我们将使用以下三个库:

  1. PyJWT:Python的JWT实现库
  2. Django REST framework:Django的REST API开发框架
  3. Django REST framework JWT:Django REST framework的JWT插件

安装上述三个库:

pip install pyjwt
pip install djangorestframework
pip install djangorestframework-jwt

接下来,我们将使用Django REST framework和Django REST framework JWT来实现JWT身份验证。首先,将Django REST framework和Django REST framework JWT添加到你的INSTALLED_APPS中:

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'rest_framework_jwt',
]

然后,配置JWT相关信息。在settings.py文件中添加以下配置:

JWT_AUTH = {
    'JWT_SECRET_KEY': 'your-secret-key',
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=30),
    'JWT_AUTH_HEADER_PREFIX': 'Bearer',
}

其中,JWT_SECRET_KEY是你用来加密和解密JWT的密钥,其他配置项可根据需要进行设置。例如,JWT_EXPIRATION_DELTA设置JWT的过期时间为7天,JWT_ALLOW_REFRESH表示允许刷新JWT,JWT_REFRESH_EXPIRATION_DELTA设置JWT刷新的过期时间为30天。

现在,我们已经完成了JWT的设置,下面是如何在Django REST framework视图中使用JWT进行身份验证。

第一步是定义一个API视图类并添加装饰器来使用JWT验证:

from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response

class MyView(APIView):
    authentication_classes = [JSONWebTokenAuthentication]
    permission_classes = [IsAuthenticated]

    def get(self, request):
        content = {'message': 'Hello, world!'}
        return Response(content)

在这个例子中,我们定义了一个API视图类MyView,使用了JSONWebTokenAuthentication进行身份验证并添加了IsAuthenticated权限的装饰器。在get方法中,我们返回了一个信息以表明身份验证成功。

现在,我们可以在客户端使用JWT来访问这个API视图。首先,我们需要使用登录API视图来获取JWT。Django REST framework JWT为我们提供了一个默认的登录API,可以通过以下方式在urls.py中定义:

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path('api/token/', obtain_jwt_token),
    # ...
]

在客户端,我们可以通过向登录API视图发送POST请求来获取JWT:

import requests

url = 'http://example.com/api/token/'
data = {'username': 'myusername', 'password': 'mypassword'}
response = requests.post(url, data=data)
jwt = response.json()['token']

返回值response是一个包含JWT的JSON对象,我们只需从它的token字段中提取出JWT即可。

然后,我们可以在客户端发送GET请求来访问MyView视图,并在请求头中添加JWT:

import requests

url = 'http://example.com/myview/'
headers = {'Authorization': f'Bearer {jwt}'}
response = requests.get(url, headers=headers)
print(response.content)

在这个例子中,我们使用requests库发送了一个GET请求,设置了Authorization请求头,并在其中添加JWT。服务器将检查JWT是否通过了JSONWebTokenAuthentication的验证,并且该JWT是否在有效期内。如果验证通过,则返回相应的信息给客户端。

至此,我们已经使用Django REST framework JWT实现了JWT身份验证。在实际项目中,你可以根据需要进行调整和扩展。

相关文章