热门标签 | 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 接口。
推荐阅读
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • andr ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文探讨了在 Vue 2.0 项目中使用 Axios 获取数据时可能出现的错误,并提供详细的解决方案和最佳实践。 ... [详细]
  • 华为USG基于源地址的多出口策略路由配置
    网络拓扑如下:组网情况:企业用户主要有技术部(VLAN10)和行政部(VLAN20),通过汇聚交换机连接到USG。企业分别通过两个不同运营商(ISP1和ISP2)连接到 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 如何在PHPCMS V9中实现多站点功能并配置独立域名与动态URL
    本文介绍如何在PHPCMS V9中创建和管理多个站点,包括配置独立域名、设置动态URL,并确保各子站能够正常运行。我们将详细讲解从新建站点到最终配置路由的每一步骤。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
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社区 版权所有