2015-01-02 3 views
4

Я разрабатываю REST API в качестве бэкэнд-приложения для Android-приложения для запуска. В настоящее время в стартапе имеется веб-версия их службы с пользователями около 10 тыс. Пользователей. У меня есть несколько сомнений относительно дизайна веб-API:Проектирование RESTful API

  1. Как я могу защитить свой API?

Я хочу, чтобы только клиент Android получал доступ к API и никому другому. Один из способов - отправить зашифрованный токен из front-end и дешифровать на внутреннем сервере. Есть ли другой путь? Кроме того, как мне его реализовать?

  1. Как сделать мой API быстрым и эффективным?

Существует особая конечная точка, к которой обращаются очень часто. Однако информация об этой конечной точке не меняется. Поэтому запросы, которые выполняются в течение короткого периода времени, скорее всего, возвратят тот же ответ. Как быстрее реагировать на такие запросы? Будет ETag и Last-Modified сделают эту работу?

  1. Должен ли я доверять данным от моего клиента?

В настоящее время, когда я получаю запрос с некоторым параметром только проверкой я выполняю по запросу, чтобы проверить, если параметр null или нет. Напр. Если запрос имеет mobile в качестве параметра, я проверяю только, присутствует ли в запросе параметр mobile. Я не выполняю другие проверки, такие как проверка длины if mobile меньше 10, а затем исключение.

EDIT: Любой, кто считает, что этот вопрос является «слишком широким», пожалуйста, оставьте комментарий, так что я могу изменить этот вопрос и добавить все необходимые детали.

+0

Вопрос широкий, но вот некоторые отзывы. 1. «безопасный» может [означать много вещей] (http://en.wikipedia.org/wiki/Information_security#Definitions). Рассмотрите, какие ресурсы вы защищаете, и как они доступны. Для конкретной задачи, о которой вы говорили, возможно, попробуйте установить сеансы по HTTPS и передать токен, но это может быть целый вопрос сам по себе. 2. Существуют факторы, которые влияют на латентность запроса API. Попробуйте использовать инструмент профилирования, чтобы определить, сколько времени тратится. Кэширование - хороший вариант, но подумайте, где это делается (база данных ?, session ?, app?). 3. Нет, никогда. – pieman72

+0

@ pieman72 1. Безопасным я имел в виду, что только клиент android может получить доступ к API. Я думаю, что токен будет работать нормально. 2. Не могли бы вы предложить хороший инструмент профилирования для измерения производительности API? 3. Да, я не должен доверять данным от клиента и выполнять все необходимые проверки. –

+0

Вам понадобятся разные инструменты в зависимости от вашего стека приложений, но похоже, что вы используете Django, поэтому, возможно, это: [https://code.djangoproject.com/wiki/ProfilingDjango](https://code.djangoproject .com/вики/ProfilingDjango) – pieman72

ответ

1

Я работаю над запуском, и у меня были почти одинаковые проблемы для решения. Я думаю, что единственное отличие заключается в первом вопросе, потому что я решил ограничить доступ API только к аутентифицированным пользователям. Тем не менее, вот как я решил свои проблемы:

1. Как защитить свой API?

Как я уже писал, я ограничил доступ API только к аутентифицированным пользователям. Я использую проверку подлинности на основе маркеров с собственными REST регистрации/аутентификации API конечных точек на основе следующих пакетов:

Если вы хотите использовать это решение Я предлагаю вам также посмотреть django-rest-auth.

2. Как сделать мой API быстрым и эффективным?

Если у вас есть «запросы, которые сделаны в течение короткого периода времени, и что, скорее всего, вернуть тот же ответ», я предлагаю вам кэшировать этот ответ, что-то вроде этого (простейший вариант):

if response_in_cache and time_passed < max_time_frame: 
    return response_in_cache 
else: 
    generate response 
    save response in the cache (for next time) 
    return response 

Вы также можете отследить свои выступления с помощью новой реликвии.

3. Должен ли я доверять данным моего клиента?

Абсолютно нет! Попробуйте использовать django-rest-framework для вашего API RESTful. Он предоставляет класс под названием Сериализатор, который дает вам мощный способ управления вводом/выводом ваших запросов и ответов. Вот пример:

Ваш сериализатору

class CommentSerializer(serializers.Serializer): 
    email = serializers.EmailField() 
    content = serializers.CharField(max_length=200) 
    created = serializers.DateTimeField() 

Validation

serializer = CommentSerializer(data={'email': 'foobar', 'content': 'baz'}) 
serializer.is_valid() 
# False 
serializer.errors 
# {'email': [u'Enter a valid e-mail address.'], 'created': [u'This field is required.']} 

Дайте взглянуть на serializer documentation.