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



我使用 Django和 Django-rest-framework。 我必须检查我的很多视图的自定义 http 标头。

对于每个视图,我需要:

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

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

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 标头,例如权限类,或者我必须编写一个基本视图来检查应用程序令牌,然后再为请求提供服务?

你可以使用它 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]
# ...

授权标头

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

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

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

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

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

然后,客户端必须使用以下方法发出授权请求:

X-APP-TOKEN:

********

似乎这个响应是由 Django 身份验证 br 返回的,因为你在标头中传递了身份验证令牌,因为上面的权限代码看起来很好。它应该返回 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',
]

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

最新更新