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

Posted

技术标签:

【中文标题】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',
]

【讨论】:

以上是关于Django-Rest-Framework 系统检查自定义 HTTP 标头(应用程序 - 令牌)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

查看系统启动内核检測硬件信息dmesg

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

如果系统处于活动状态,如何检入C ++?

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