2015-11-06 51 views
3

我正在Django 1.8中使用優秀的django-rest-framework。我有一個公共的RESTful API。django-rest-framework認證:需要URL中的關鍵參數?

我現在想開始要求使用此API的key GET參數,並且不允許沒有這個參數的任何請求。我會根據請求手動爲用戶分配密鑰。

我已經通過DRF Authentication documentation閱讀,但我不知道有什麼是符合我的使用情況。我覺得這很奇怪,因爲我的用例一定很常見。

基於令牌的認證需要用戶設置的HTTP標頭。我的典型API用戶並不複雜(將會下載CSV的Excel用戶),所以我不認爲我可以讓他們這樣做。

我認爲基本認證正是我需要的,但我寧願提供比Django的用戶名和密碼(我的應用程序沒有用戶的概念現在)一個簡單的基於URL的關鍵。

實現此目的的最佳方法是什麼?

回答

6

創建一個將包含所有你發給別人鍵的表。

例子:

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

接下來創建一個自定義Permision類將請求轉發給的觀點一樣,之前您在URL中的API密鑰:

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): 
    . . . 
+1

完美的作品,謝謝。幾個人的筆記這樣做:我不得不在視圖中導入'permission_classes'以使裝飾工作。我將自定義的'OnlyAPIPermission'類放在應用程序中的一個新文件中,然後將其導入到視圖中。 – Richard