DjangoToken认证详解与HTTP401、403状态码的区别
作者:逸之思 | 来源:互联网 | 2024-12-20 15:43
本文详细介绍了如何在Django中配置和使用Token认证,并解释了HTTP401和HTTP403状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。
### Django Token 认证环境搭建 首先,确保安装了必要的模块。使用以下命令安装 `djangorestframework`: ```bash pip install djangorestframework ``` 接下来,在项目的 `settings.py` 文件中进行相关配置。添加如下内容以启用 REST 框架和 Token 认证: ```python INSTALLED_APPS = [ ... 'rest_framework', 'rest_framework.authtoken', ] REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.AllowAny', # 允许所有用户访问 ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', # 启用 Token 认证 ] } ``` #### 同步数据库生成 Token 表 运行以下命令同步数据库并创建 `authtoken_token` 表: ```bash python manage.py migrate ``` ### 编写登录视图函数 为了实现用户登录并生成 Token,可以编写一个视图类。以下是具体代码示例: ```python from django.contrib.auth import authenticate, login from rest_framework.authtoken.models import Token from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework.views import APIView class LoginViewSet(APIView): permission_classes = (AllowAny,) # 登录接口允许所有人访问 def post(self, request, *args, **kwargs): username = request.data.get('username') password = request.data.get('password') user = authenticate(username=username, password=password) if not user: return Response({'code': 1, 'msg': '用户名或密码错误'}) else: # 删除旧的 Token old_token = Token.objects.filter(user=user) old_token.delete() # 创建新的 Token token = Token.objects.create(user=user) return Response({'code': 0, 'msg': '登录成功!', 'username': user.username, 'token': token.key}) ``` ### 配置 URL 访问路径 在 `urls.py` 中添加相应的 URL 路由配置: ```python from django.urls import path from .views import LoginViewSet urlpatterns = [ path('login/', LoginViewSet.as_view(), name='login'), ] ``` ### Token 认证接口示例 对于需要 Token 认证的接口,可以在视图类中指定认证方式和权限类。例如: ```python from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView class CardListAPIView(APIView): authentication_classes = (TokenAuthentication,) # 使用 Token 进行认证 permission_classes = (IsAuthenticated,) # 只有已认证用户才能访问 def get(self, request, format=None): cards = Card.objects.all() serializer = CardAPISerializer(cards, many=True) return Response({'code': 0, 'msg': 'success!', 'data': serializer.data}) def post(self, request, format=None): verify_data = CardAPISerializer(data=request.data) if verify_data.is_valid(): verify_data.save() return Response({'code': 0, 'msg': 'success!', 'data': request.data}) ``` ### 接口访问示例 当用户尝试访问受保护的接口时,必须提供有效的 Token。如果缺少 Token 或 Token 无效,则会返回 HTTP 401 Unauthorized 错误;如果用户没有足够的权限,则会返回 HTTP 403 Forbidden 错误。 #### HTTP 401 和 403 的区别 - **HTTP 401 Unauthorized**:表示请求未经过身份验证或提供的凭据无效。通常是因为用户未登录或 Token 无效。 - **HTTP 403 Forbidden**:表示请求已经过身份验证,但用户没有执行该操作的权限。例如,普通用户试图访问仅限管理员的操作。 总结来说,401 表示认证失败,而 403 表示权限不足。理解这两者的区别有助于更好地设计和调试安全的 API 接口。
推荐阅读
本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ...
[详细]
蜡笔小新 2024-12-28 10:36:30
本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ...
[详细]
蜡笔小新 2024-12-27 16:27:52
在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ...
[详细]
蜡笔小新 2024-12-27 15:26:10
本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ...
[详细]
蜡笔小新 2024-12-28 12:22:34
本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ...
[详细]
蜡笔小新 2024-12-28 11:52:00
本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ...
[详细]
蜡笔小新 2024-12-28 10:48:41
本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ...
[详细]
蜡笔小新 2024-12-28 09:46:23
本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ...
[详细]
蜡笔小新 2024-12-28 08:39:55
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ...
[详细]
蜡笔小新 2024-12-27 19:31:05
本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ...
[详细]
蜡笔小新 2024-12-27 17:40:42
c# – UWP:BrightnessOverride StartOverride逻辑 ...
[详细]
蜡笔小新 2024-12-27 16:56:40
本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ...
[详细]
蜡笔小新 2024-12-27 16:38:48
本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ...
[详细]
蜡笔小新 2024-12-27 15:04:09
本文详细介绍了如何在Debian系统中正确配置Locale,以确保多语言支持和避免常见的警告信息。 ...
[详细]
蜡笔小新 2024-12-26 10:12:14