Django Rest框架系统,用于检查自定义HTTP头(应用程序-令牌)

Django Rest框架系统,用于检查自定义HTTP头(应用程序-令牌),django,authentication,django-rest-framework,permissions,authorization,Django,Authentication,Django Rest Framework,Permissions,Authorization,我使用Django和Django-rest框架。 我必须为我的许多视图检查自定义http头 对于每个视图,我需要: 检查http自定义头是否存在(X-APP-TOKEN) 检查此令牌是否正确 为请求提供服务或返回HTTP错误(例如403) 有什么方法我可以遵循吗? 例如,类似rest框架视图的permissions\u类。 我尝试实现如下自定义权限: class IsAuthorizedApplication(BasePermission): def has_permission(self

我使用Django和Django-rest框架。 我必须为我的许多视图检查自定义http头

对于每个视图,我需要:

  • 检查http自定义头是否存在(X-APP-TOKEN)
  • 检查此令牌是否正确
  • 为请求提供服务或返回HTTP错误(例如403)
有什么方法我可以遵循吗? 例如,类似rest框架视图的permissions\u类。 我尝试实现如下自定义权限:

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
但是我认为这种方法是基于
djnagorest框架的身份验证系统的。在我收到“虚假申报”的情况下生效:

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

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

这似乎是django auth BR返回的响应,因为您在头中有pass auth token,因为上面的权限代码看起来不错。它应该返回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',
]
你可以用这个

使用pip安装最新版本:

pip安装djangorestframework api密钥

#settings.py
已安装的应用程序=[
# ...
“rest_框架”,
“rest\u框架\u api\u密钥”,
]
确保“rest\u framework\u api\u key”位于“rest\u framework”之后, 运行包括的迁移:

python manage.py迁移

然后从管理员创建新密钥

现在

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

您可以全局设置权限:

#settings.py
REST_框架={
“默认权限类”:[
“rest\u框架\u api\u key.permissions.HasAPIKey”,
]
}
或基于每个视图:

#views.py
从rest_framework.views导入APIView
从rest\u framework\u api\u key.permissions导入HasAPIKey
类UserListView(APIView):
权限\u类=[HasAPIKey]
# ...
认证头 默认情况下,客户端必须通过授权标头传递其API密钥。其格式必须如下所示: 其中,*******表示生成的API密钥

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

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

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

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

此链接很好
# settings.py
API_KEY_CUSTOM_HEADER = "X-APP-TOKEN"