【问题标题】:django-rest-framework authentication: require key parameter in URL?django-rest-framework 身份验证:需要 URL 中的关键参数?
【发布时间】:2016-02-07 05:33:43
【问题描述】:

我正在使用出色的 django-rest-framework 使用 Django 1.8。我有一个公共的 RESTful API。

我现在想开始使用此 API 要求 key GET 参数,并禁止任何没有此参数的请求。我将根据要求手动为用户分配密钥。

我已经阅读了DRF Authentication documentation,但我不确定是否有任何内容符合我的用例。我觉得这很奇怪,因为我的用例一定很常见。

基于令牌的身份验证要求用户设置 HTTP 标头。我的典型 API 用户并不复杂(将下载 CSV 的 Excel 用户),所以我认为我不能要求他们这样做。

我认为 Basic-Auth 是我需要的,但我更愿意提供一个简单的基于 URL 的密钥,而不是 Django 用户名和密码(我的应用程序现在没有用户的概念)。

实现这一点的最佳方法是什么?

【问题讨论】:

    标签: django authentication django-rest-framework


    【解决方案1】:

    创建一个表,其中包含您向某人发出的所有密钥。

    例子:

    class RestApiKey(models.Model):
        api_key = models.CharField(max_length=100)
    

    接下来创建一个自定义 Permision 类,该类将在将请求转发到视图之前检查 url 中的 api Key,例如:

    from rest_framework import permissions
    from yourappname.models import RestApiKey
    
    class OnlyAPIPermission(permissions.BasePermission):
        def has_permission(self, request, view):
            try:
                api_key = request.QUERY_PARAMS.get('apikey', False)
                RestApiKey.objects.get(api_key=api_key)
                return True
            except:
                return False
    

    所以请求 url 必须像 http://yourdomain.com/?apikey=sgvwregwrgwg

    接下来在您的视图中添加权限类:

    class YourViewSet(generics.ListAPIView):
        permission_classes = (OnlyAPIPermission,)
    

    或者如果您使用的是基于函数的视图,请执行以下操作:

    @permission_classes((OnlyAPIPermission, ))
    def example_view(request, format=None):
        . . .
    

    【讨论】:

    • 完美运行,谢谢。给其他人做这件事的几点注意事项:我必须在视图中导入 permission_classes 才能让装饰器工作。我将自定义的OnlyAPIPermission 类放在应用程序的一个新文件中,然后将其导入到视图中。
    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 2021-08-02
    • 2013-05-03
    • 2021-09-09
    • 2015-11-12
    • 2015-12-26
    • 2020-04-10
    • 2015-06-01
    相关资源
    最近更新 更多