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 标头(应用程序 - 令牌)的主要内容,如果未能解决你的问题,请参考以下文章
django-rest-framework- 使用“或”过滤来自一个 url 参数的多个值