Django-Rest-Framework 系统检查自定义 HTTP 标头(应用程序 - 令牌)

     2023-02-19     168

关键词:

【中文标题】Django-Rest-Framework 系统检查自定义 HTTP 标头(应用程序 - 令牌)【英文标题】:Django-Rest-Framework system to check custom HTTP header (application - token) 【发布时间】:2020-04-17 07:05:30 【问题描述】:

我使用 Django 和 Django-rest-framework。 我必须检查一个自定义的 http 标头以了解我的很多观点。

对于每个视图我需要:

检查http自定义标头是否存在(X-APP-TOKEN); 检查此令牌是否正确; 处理请求或返回 HTTP 错误(例如 403);

有什么我可以遵循的方法吗? 例如,rest-framework 视图的 permissions_class 之类的。 我试图实现这样的自定义权限:

class IsAuthorizedApplication(BasePermission):

def has_permission(self, request, view):

    app_id = request.META.get(app_settings.APPS_HEADER_AUTHORIZATION_APP_ID)
    secret_token = request.META.get(app_settings.APPS_HEADER_AUTHORIZATION_APP_TOKEN)

    if app_id and secret_token:

        try:
            selected_app = Application.objects.get(app_uuid=app_id, status=ApplicationStatusType.ACTIVE)
            // Check secret token
            return True
        except Application.DoesNotExist:
            return False
    return False

但我认为这种做法是基于djnago-rest-framework的认证系统。事实上,如果我收到“错误退货”:

401 - "detail":"Authentication credentials were not provided."

是否有一些不同的方法来检查自定义 http 标头(如权限类),还是让我编写一个基本视图来检查应用程序令牌,然后再为请求提供服务?

【问题讨论】:

【参考方案1】:

为了实现自定义身份验证,您需要从“BaseAuthentication”继承并覆盖身份验证方法,它必须为未经过身份验证的用户返回 None 或 (user, auth) 对于经过身份验证的用户,请参阅文档以获取更多信息 https://www.django-rest-framework.org/api-guide/authentication/#custom-authentication

【讨论】:

【参考方案2】:

你可以用这个 https://pypi.org/project/djangorestframework-api-key/

使用 pip 安装最新版本:

pip install djangorestframework-api-key

# settings.py

INSTALLED_APPS = [
  # ...
  "rest_framework",
  "rest_framework_api_key",
]

确保“rest_framework_api_key”在“rest_framework”之后,

运行包含的迁移:

python manage.py 迁移

然后从管理员创建新密钥

现在

HasAPIKey 权限类保护 API 密钥授权后的视图。

您可以全局设置权限:

# settings.py
REST_FRAMEWORK = 
    "DEFAULT_PERMISSION_CLASSES": [
        "rest_framework_api_key.permissions.HasAPIKey",
    ]

或按观看次数计算:

# views.py
from rest_framework.views import APIView
from rest_framework_api_key.permissions import HasAPIKey

class UserListView(APIView):
    permission_classes = [HasAPIKey]
    # ...

授权标头

默认情况下,客户端必须通过 Authorization 标头传递其 API 密钥。格式必须如下:

Authorization: Api-Key ********

其中 ******** 指的是生成的 API 密钥。

或者你可以这样做 例如,如果您设置:

# settings.py
API_KEY_CUSTOM_HEADER = "X-APP-TOKEN"

那么客户端必须使用以下方式发出授权请求:

X-APP-TOKEN: ********

【讨论】:

florimondmanca.github.io/djangorestframework-api-key/guide这个链接不错【参考方案3】:

似乎这个响应是由 django auth 返回的,因为您在标头中传递了身份验证令牌,因为上面的代码看起来不错。它应该返回 403。

请检查djnago restframework的默认设置

REST_FRAMEWORK = 
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]

If not specified, this setting defaults to allowing unrestricted access:

'DEFAULT_PERMISSION_CLASSES': [
   'rest_framework.permissions.AllowAny',
]

【讨论】:

ocr技术在机动车检测(综检安检环检三合一系统)中应用

OCR技术在机动车检测(综检、安检、环检三合一系统)中应用机动车检测站为充分利用现有检测设备和人员优势,优化检测流程,升级检测网络系统,方便车主在一次上线检测过程中能完成机动车的技术状况检测、维修竣工质量... 查看详情

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

】如何在django-rest-framework中为API使用TokenAuthentication【英文标题】:HowtouseTokenAuthenticationforAPIindjango-rest-framework【发布时间】:2013-07-0718:26:11【问题描述】:我有一个django项目,使用django-rest-framework来创建api。想要使用基于令牌的... 查看详情

全自动设备管理系统cnc管理系统机床管理系统cnc设备点检系统cnc机床设备报修系统机床报修系统

设备管理系统CNC管理系统机床管理系统CNC设备点检系统CNC机床设备报修系统机床报修系统本系统和市场其它系统比较最大特点,设备故障系统自动记录故障代码,自动推送给相关人员,设备运行时间自动统计上报,无全不用人为... 查看详情

秒表检定仪和瞬时日差检定仪使用介绍

...择电能表日差,选择闸门时间,然后进行测量数据,最终系统会根据测量结果,计算出PPM、日差、月差、年差。测量电秒表日差操作方法,选择电秒表日差,选择闸门时间,然后进行测量数据,测量完成后系统会根据测量结果,... 查看详情

django-rest-framework- 使用“或”过滤来自一个 url 参数的多个值

】django-rest-framework-使用“或”过滤来自一个url参数的多个值【英文标题】:django-rest-framework-Filteringusing\'or\'onmultiplevaluesfromoneurlparameter【发布时间】:2020-01-1019:14:24【问题描述】:我为我的API公开的模型设置了一个标记系统。模... 查看详情

断言错误:Django-rest-Framework

】断言错误:Django-rest-Framework【英文标题】:Assertionerrorat:Django-rest-Framework【发布时间】:2015-02-1313:36:02【问题描述】:我正在使用python3.4、Django1.7.1(书中考虑的版本)、Postgres9.3,我的IDE是Eclipse。我一直在研究“轻量级Django-E... 查看详情

记录对 django-rest-framework 的请求

】记录对django-rest-framework的请求【英文标题】:Loggingrequeststodjango-rest-framework【发布时间】:2013-03-1219:37:12【问题描述】:出于调试目的,我想使用Django的日志记录机制来记录每个“到达”django-rest-framework门口的传入请求。Djagno... 查看详情

django-rest-framework:如何序列化已经包含 JSON 的字段?

】django-rest-framework:如何序列化已经包含JSON的字段?【英文标题】:django-rest-framework:HowDoISerializeaFieldThatAlreadyContainsJSON?【发布时间】:2014-04-0501:41:03【问题描述】:我对django-rest-framework还是很陌生,所以需要一些帮助。我有一... 查看详情

django-rest-framework: api 版本控制

】django-rest-framework:api版本控制【英文标题】:django-rest-framework:apiversioning【发布时间】:2012-12-2512:52:55【问题描述】:谷歌搜索似乎普遍认为,在RESTURI中嵌入版本号是一种不好的做法和一个坏主意。即使在SO上,也有强烈的支持... 查看详情

django-rest-framework 按日期过滤=无

】django-rest-framework按日期过滤=无【英文标题】:django-rest-frameworkfilterbydate=None【发布时间】:2014-02-2611:35:00【问题描述】:我正在使用django-rest-framework和django-filter。我需要检索date属性为None的小部件列表,但无论我尝试什么查询... 查看详情

django-rest-framework、多表模型继承、ModelSerializers 和嵌套序列化器

】django-rest-framework、多表模型继承、ModelSerializers和嵌套序列化器【英文标题】:django-rest-framework,multitablemodelinheritance,ModelSerializersandnestedserializers【发布时间】:2014-07-2518:17:22【问题描述】:我在文档或互联网上找不到此信息。... 查看详情

为啥 django-rest-framework 不显示 OneToOneField 数据 - django

】为啥django-rest-framework不显示OneToOneField数据-django【英文标题】:Whydjango-rest-frameworkdoesn\'tdisplayOneToOneFielddata-django为什么django-rest-framework不显示OneToOneField数据-django【发布时间】:2018-02-1616:26:13【问题描述】:我想在我的网站中... 查看详情

用于检索子进程输出的python代码(linux ps命令)

...】:我想创建python3代码,通过运行linux命令“ps”来过滤系统进程。这是我当前的代码:importsubprocess,tempfilecommand=\'ps-fe|grepjav 查看详情

django-rest-framework:每个 ViewSet 可以有多个模板吗?

】django-rest-framework:每个ViewSet可以有多个模板吗?【英文标题】:django-rest-framework:CanIhavemultipletemplatesperViewSet?【发布时间】:2020-07-0701:30:04【问题描述】:我为我的模型创建了一个序列化程序和ViewSet,并为列表视图添加了一个... 查看详情

我无法使用 Django-Rest-Framework 注册用户

】我无法使用Django-Rest-Framework注册用户【英文标题】:IcannotregisterauserusingDjango-Rest-Framework【发布时间】:2021-04-0621:11:54【问题描述】:我无法使用DjangoRestFramework添加新用户。这是我的models.py代码:classProfile(models.Model):user=models.O... 查看详情

使用 django-rest-framework 创建对象后返回 id 值

】使用django-rest-framework创建对象后返回id值【英文标题】:Returningidvalueafterobjectcreationwithdjango-rest-framework【发布时间】:2013-09-1920:32:03【问题描述】:我正在使用django-rest-framework通用视图通过POST请求在模型中创建对象。我想知道... 查看详情

在 django-rest-framework 中捕获参数

】在django-rest-framework中捕获参数【英文标题】:Captureparametersindjango-rest-framework【发布时间】:2014-02-1302:01:42【问题描述】:假设这个网址:http://localhost:8000/articles/1111/comments/我想获取给定文章的所有cmets(此处为1111)。这就是... 查看详情

django-rest-framework 是不是提供管理站点来管理模型?

】django-rest-framework是不是提供管理站点来管理模型?【英文标题】:Doesthedjango-rest-frameworkprovideanadminsitetomanagemodels?django-rest-framework是否提供管理站点来管理模型?【发布时间】:2020-12-1812:02:18【问题描述】:我正在寻找使用djang... 查看详情