2010-12-16 75 views
8

我一直在閱讀django-piston上的很多文章,並正在使用它來爲我正在開發的應用程序創建一個API,但是我在世界的客戶端被掛斷了。我編寫了處理程序和uri映射,並且可以將JSON或XML返回到我的內容中。我陷入困境的是現在該怎麼做。寫一個Django活塞客戶端的正確方法是什麼?

我的理想最終目標是讓iPhone和Android客戶端使用並返回數據,但我不知道處理認證的正確方法。我能想到的最簡單的方法是在設備上保存用戶名和密碼,並使用它爲每個請求添加標籤,最終使用基本身份驗證,但這種方式錯了。我已經注意到活塞對OAuth的支持,並在this tutorial的幫助下得到了它的工作,但那也不是正確的答案。最終,我真的很想在設備上提供用戶名和密碼的簡單提示,這些提示將通過Piston和REST發送到Django,並且API密鑰將返回。該設備將存儲該密鑰並用它標記所有後續請求。這感覺像正確的方式,但我不知道如何去做。任何一個人都可以指向正確的方向嗎?

+0

OAuth有什麼不對嗎? – klemens 2010-12-16 13:42:18

回答

22

您可以編寫自己的認證模塊。這裏有一個例子:

class ApiKeyAuthentication(object): 

    def is_authenticated(self, request): 
     auth_string = request.META.get("HTTP_AUTHORIZATION") 

     if not auth_string: 
      return False 

     key = get_object_or_None(ApiKey, key=auth_string) 

     if not key: 
      request.user = AnonymousUser() 
      return False 

     request.user = key.user 

     return True 

    def challenge(self): 
     resp = HttpResponse("Authorization Required") 
     resp['WWW-Authenticate'] = "Key Based Authentication" 
     resp.status_code = 401 
     return resp 

你需要一個模型,API密鑰的存儲映射到用戶:

class ApiKey(models.Model): 
    user = models.ForeignKey(User, related_name='keys') 
    key = models.CharField(max_length=KEY_SIZE) 

你需要一些方法來生成實際的密鑰。這樣的事情就可以了(比如,在ApiKey模型save方法:

key = User.objects.make_random_password(length=KEY_SIZE) 

while ApiKey.objects.filter(key__exact=key).count(): 
    key = User.objects.make_random_password(length=KEY_SIZE) 

最後,連上新的認證後端:

# urls.py 

key_auth = ApiKeyAuthentication() 

def ProtectedResource(handler): 
    return resource.Resource(handler=handler, authentication=key_auth) 

your_handler = ProtectedResource(YourHandler) 

至於API密鑰交換的用戶名/密碼,只要編寫一個處理程序,使用BasicAuthentication創建並返回新的ApiKey(對於request.user)。

+0

很好,基本上我在想這會是,所以我很感謝你的拼寫。 ! – eddieroger 2010-12-24 21:24:50

相關問題