Django Rest Framework 的基于密钥的访问

Sai*_*hna 5 django django-rest-framework

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

/api_auth/user/
Run Code Online (Sandbox Code Playgroud)

但我想限制只有拥有api_key 的人才能访问此列表

 /api_auth/user/?access_key=$omeRandomHash3252532
Run Code Online (Sandbox Code Playgroud)

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

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

Ser*_*eim 4

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:
            引发异常。AuthenticationFailed('没有 API 密钥的用户')

        返回(用户,无)

应该APIKeyAuthentication放在authentication.py模块上并使用REST_FRAMEWORKsettings.py上的设置进行配置,如下所示

休息框架 = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'my_custom_package.authentication.APIKeyAuthentication',
    )
}

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

至于get_user_from_api_key功能,它的实现取决于您的需求。例如,如果您想为每个用户创建一个新的 api 密钥,您应该创建一个APIKey模型,该模型将具有api_key CharFieldForeignKeyUser具有 this 的api_key。然后,该get_user_from_api_key函数将查询APIKey模型以获取用户提供的api_key.

更新

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

从rest_framework导入权限

类 APIKeyPermission(permissions.BasePermission):
    def has_permission(自身,请求,视图):
        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对象级权限而不是视图级权限。