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

Ric*_*ard 3 authentication django django-rest-framework

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

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

我已阅读DRF身份验证文档,但我不确定是否有任何符合我用例的内容.我发现这很奇怪,因为我的用例必须非常普遍.

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

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

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

Anu*_*dra 6

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

例:

class RestApiKey(models.Model):
    api_key = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

接下来创建一个自定义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
Run Code Online (Sandbox Code Playgroud)

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

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

class YourViewSet(generics.ListAPIView):
    permission_classes = (OnlyAPIPermission,)
Run Code Online (Sandbox Code Playgroud)

或者如果您使用的是基于功能的视图,那么请执

@permission_classes((OnlyAPIPermission, ))
def example_view(request, format=None):
    . . .
Run Code Online (Sandbox Code Playgroud)

  • 完美运行,谢谢。对于其他这样做的人来说,有几点需要注意:我必须在视图中导入“permission_classes”才能使装饰器正常工作。我将自定义的“OnlyAPIPermission”类放入应用程序的新文件中,然后将其导入视图中。 (2认同)