2010-12-16 2 views
8

Я много читал о django-piston и использую, чтобы создать API для приложения, которое я разрабатываю, но меня подвешивают на клиентской стороне мира. Я написал обработчики и сопоставления uri, и я могу вернуть JSON или XML в содержание моего сердца. Где я застрял, что с этим делать сейчас.Каков правильный способ написать клиент django-piston?

Мой идеальный эндшпиль должен иметь iPhone и Android-клиент, которые потребляют и возвращают данные, но я не знаю, как правильно обрабатывать аутентификацию. Самый простой способ, которым я могу понять, - сохранить имя пользователя и пароль на устройстве и пометить каждый запрос с ним, в конечном счете используя базовую проверку подлинности, но это приводит к ошибкам. Я посмотрел на поддержку поршня OAuth и получил его работу с помощью this tutorial, но это тоже не похоже на правильный ответ. В конечном счете, мне бы очень хотелось иметь простую подсказку на устройстве для имени пользователя и пароля, которые будут отправлены в Django через Piston и REST, а ключ 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) 

Вам потребуется какой-то способ, чтобы генерировать фактические ключи. Что-то, как это будет работать (скажем, в save методы модели ApiKey в:

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