gpt4 book ai didi

django - Django Rest 框架的基于 key 的访问

转载 作者:行者123 更新时间:2023-12-01 00:55:36 24 4
gpt4 key购买 nike

假设获取用户列表的 API 端点是这样的

/api_auth/user/

但我想限制只有拥有 的人才能访问此列表。 api_key
 /api_auth/user/?access_key=$omeRandomHash3252532

如何使用 Django Rest Framework 实现这样的访问系统?

我应该使用权限来实现吗?

最佳答案

django-rest-framework 不支持开箱即用,但是可以轻松实现:

如果你看看http://www.django-rest-framework.org/api-guide/authentication/您将看到自定义身份验证方法的示例。基于此,您需要实现以下内容:

从 django.contrib.auth.models 导入用户
从 rest_framework 导入认证
从 rest_framework 导入异常

类 APIKeyAuthentication(authentication.BaseAuthentication):
def 身份验证(自我,请求):
api_key = request.GET.get('api_key')
如果不是 api_key:
返回无

尝试:
用户 = get_user_from_api_key(api_key)
除了 User.DoesNotExist:
raise exceptions.AuthenticationFailed('API KEY 没有用户')

返回(用户,无)
APIKeyAuthentication应该放在 authentication.py 模块上并配置为 REST_FRAMEWORK在settings.py上设置,像这样

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':(
'my_custom_package.authentication.APIKeyAuthentication',
)
}

现在,上面所做的是检查 api_key参数存在(如果不存在,它将返回 None 以检查请求是否可以通过不同方式进行身份验证 - 如果您不想检查任何其他身份验证类,则只需引发 exceptions.AuthenticationFailed 异常,就像我们在找不到用户时所做的那样下面。现在,我们需要实现一个 get_user_from_api_key 函数,该函数将从 API_KEY 返回一个 User 实例。如果找到与传递的 api_key 相关的用户,则返回它,如果不是 exceptions.AuthenticationFailed 异常将被抛出。

关于get_user_from_api_key功能,其实现取决于您的要求。例如,如果你想为每个用户创建一个新的 api key ,你应该创建一个 APIKey具有 api_key 的模型CharFieldForeignKeyUser有这个api_key . get_user_from_api_key然后函数将查询 APIKey使用提供的 api_key 获取用户的模型.

更新

如果你想使用 django-rest-framework 权限而不是身份验证,你可以创建一个 APIKeyPermission像这样的类:

从 rest_framework 导入权限

类 APIKeyPermission(permissions.BasePermission):
def has_permission(self, request, view):
api_key = request.GET.get('api_key')
返回 check_permission(api_key, 请求)
check_permission函数将检查传递的 api_key 是否具有该特定请求的权限。请查看 http://www.django-rest-framework.org/api-guide/permissions/ 上的示例更多信息 - 您可以选择实现 has_object_permission实现对象级权限而不是 View 级权限。

关于django - Django Rest 框架的基于 key 的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28274825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com