2010-12-16 15 views
8

Django-piston üzerinde çok fazla şey okuyorum ve geliştirdiğim bir uygulama için bir API oluşturmak için kullanıyordum, ancak dünyanın müşteri tarafında asılıyorum. İşleyicileri ve uri eşleştirmelerini yazdım ve kalbin içeriğine JSON veya XML'i döndürebiliyorum. Takıldığım yer şu an bununla ne yapacağım.Django-pistonlu bir istemci yazmanın doğru yolu nedir?

İdeal oyunum bir iPhone ve Android istemcisinin veri alıp vermesi, ancak kimlik doğrulamanın üstesinden gelmenin doğru yolunu bilmiyorum. Anlayabildiğim en kolay yol, cihazdaki kullanıcı adı ve şifrenin kaydedilmesi ve her isteğin temel etiketleme ile yapılması, sonuçta Temel Kimlik Doğrulama'nın kullanılmasıdır, ancak bu yanlışlar yanıltıcıdır. Pistonun desteğini OAuth'a baktım ve this tutorial'un yardımıyla çalışmayı başardım, ama bu da doğru cevap gibi hissetmiyor. Nihayetinde, kullanıcı adı ve şifre için cihaz üzerinde basit bir komut istemeyi çok istiyorum, bunlar Piston ve REST aracılığıyla Django'ya gönderilecek ve bir API anahtarı geri dönecektir. Cihaz bu anahtarı saklayacak ve sonraki tüm istekleri etiketleyecektir. Bu doğru yol gibi geliyor, ama nasıl yapacağımı anlayamıyorum. Herhangi biri bana doğru yönde işaret edebilir mi?

+0

OAuth ile ilgili sorun nedir? – klemens

cevap

22

Kendi kimlik doğrulama modülünüzü yazabilirsiniz.

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 

Sen Kullanıcılara API anahtarlarının bir eşleme saklamak için bir model gerekir::

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

Sen gerçek anahtarları üretmek için bazı yöntem gerekir İşte bir örnek. Sadece, bir API anahtarı için kullanıcı adı/şifre takas gelince

# urls.py 

key_auth = ApiKeyAuthentication() 

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

your_handler = ProtectedResource(YourHandler) 

:

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) 

Son olarak, yeni kimlik doğrulama arka uç kanca: Böyle bir şey ApiKey modelin save yöntemde, diyelim (çalışacaktır Oluşturmak ve yeni ApiKey (request.user için) dönmek için BasicAuthentication kullanan bir işleyici yazın.

+0

Parlak. Temel olarak ne olacağını düşünüyordum, bu yüzden bu kadar somut bir şekilde yazdığınızı takdir ediyorum. ! – eddieroger

İlgili konular