django-rest-framework authentication:URL中的key参数?

时间:2015-11-06 06:12:03

标签: django authentication django-rest-framework

我正在使用优秀的django-rest框架在Django 1.8中工作。我有一个公共的RESTful API。

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

我已阅读DRF Authentication documentation,但我不确定是否有任何符合我用例的内容。我发现这很奇怪,因为我的用例必须非常普遍。

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

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

实施此方法的最佳方法是什么?

1 个答案:

答案 0 :(得分:6)

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

示例:

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

因此请求网址必须与http://yourdomain.com/?apikey=sgvwregwrgwg

类似

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

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

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

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