我正在使用优秀的django-rest框架在Django 1.8中工作。我有一个公共的RESTful API。
我现在想开始要求使用此API的key
GET参数,并禁止任何没有此参数的请求。我会根据请求手动为用户分配密钥。
我已阅读DRF Authentication documentation,但我不确定是否有任何符合我用例的内容。我发现这很奇怪,因为我的用例必须非常普遍。
基于令牌的身份验证要求用户设置HTTP标头。我的典型API用户并不复杂(将要下载CSV的Excel用户),所以我认为我不能让他们这样做。
我认为Basic-Auth是我所需要的,但我更愿意提供一个简单的基于URL的密钥,而不是Django用户名和密码(我的app现在没有用户的概念)。
实施此方法的最佳方法是什么?
答案 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):
. . .