热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DjangoToken认证详解与HTTP401、403状态码的区别

本文详细介绍了如何在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 接口。
推荐阅读
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 解决FCKeditor应用主题后上传问题及优化配置
    本文介绍了在Freetextbox收费后选择FCKeditor作为替代方案时遇到的上传问题及其解决方案。通过调整配置文件和调试工具,最终解决了上传失败的问题,并对相关配置进行了优化。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 5G至4G空闲态移动TAU流程解析
    本文详细解析了用户从5G网络移动到4G网络时,在空闲态下触发的跟踪区更新(TAU)流程。通过N26接口实现无缝迁移,确保用户体验不受影响。 ... [详细]
  • 本文详细介绍了如何在Debian系统中正确配置Locale,以确保多语言支持和避免常见的警告信息。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文介绍如何使用 Python 的 xlrd 库读取 Excel 文件,并将其数据处理后存储到数据库中。通过实际案例,详细讲解了文件路径、合并单元格处理等常见问题。 ... [详细]
  • 本文探讨了在Django项目中,如何在对象详情页面添加前后导航链接,以提升用户体验。文章详细描述了遇到的问题及解决方案。 ... [详细]
author-avatar
逸之思
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有