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_framework
和myapp
:
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技术站