Как я реализую аутентификацию успокоительный путь?

Я создаю дневник изображения на веб-приложении механизм приложения Google с помощью Python. Пользователи могут подписаться и разместить фотографии к своему дневнику.

Кроме того, я пытаюсь соответствовать так, как я могу остальным архитектура выполнения вещей.

Схема аутентификации базируется как это для веб-приложения:
1. Отправьте имя пользователя/пароль от frontend
2. Бэкенд настраивает cookie, если аутентификация успешна
3. Остальная часть выполненных вызовов Ajax аутентифицируется с помощью этого cookie.

Там какой-либо путь состоит в том, чтобы соответствовать REST, не используя cookie?

Теперь, я также создаю приложение андроида, где пользователи могут регистрироваться и отправить/просмотреть свой дневник изображения. Я должен выставить данные из хранилища данных веб-приложения, таким образом, я буду создавать веб-сервис для выборки данных из хранилища данных.

Схема аутентификации для клиента андроида:
ОПЦИЯ a
1. Отправьте имя пользователя/пароль по https к веб-сервису
2. Веб-сервис возвращается, уникальный маркер авторизации (сохраните маркер в username/pwd таблице на хранилище данных),
3. Запросите последующие сервисы путем добавления этого маркера к Заголовку Запроса запроса
4. Сервер отображает маркер на username/pwd таблицу и возвращает данные, если маркер найден
5. Маркер авторизации истекает после определенного промежутка времени

ОПЦИЯ b
1. Настройте секретный ключ на стороне клиента и сервера
2. Используйте "username:hash пароля и секретного ключа" в заголовке авторизации каждого запроса
3. сервер генерирует пароль путем извлечения пароля из значения хэш-функции с помощью того же хеш-алгоритма; если успешные данные возвратов
btw, я не хотел использовать основную авторизацию из-за ее уязвимостей системы обеспечения безопасности.

Который лучше?

Там другие значительно лучшие пути состоят в том, чтобы выполнить то, что я пытаюсь сделать? Безопасность является настоящим беспокойством обо мне btw.
Я ценил бы, если у кого-либо есть понимание этой проблемы.спасибо.


Я проводил некоторое исследование сам относительно того, что было бы лучшим решением. Я думаю, что 2-ногий OAuth мог бы работать в моем случае предложенным Leonm.
В этом случае сервер должен предоставить клиенту потребительский ключ/секрет, который в моем случае является hardcoded в приложении.

Шаги теперь были бы:
1. Генерируйте подпись с помощью oauth_parameters (consumer_key, signature_method, метка времени), запросите URL, запросите параметры и СЕКРЕТ.
2. Включайте подпись, параметры OAuth при выполнении запроса.
3. Сервер проверяет запрос путем генерации подписи снова кроме этого случая, это использует СЕКРЕТ, который соответствует ключу

Я думаю этот способ, которым я в значительной степени подтверждаю остальным принципы. Сервер без статистики как я далеко, я понимаю теперь.

Каковы профессионалы/недостатки при выполнении вещей этот путь?

12
задан Marty 22 July 2010 в 08:41
поделиться

3 ответа

Вы можете использовать комбинацию HTTPS и HTTP Basic Auth. Оба являются существующими стандартами и должны быть достаточно безопасными при совместном использовании.

1
ответ дан 2 December 2019 в 22:22
поделиться

Если "безопасность - это проблема", то я бы сказал, что вам лучше использовать открытые стандарты и библиотеки для достижения желаемого. Основная причина этого в том, что если вы будете делать это сами, вы, скорее всего, что-нибудь забудете; на эти стандарты смотрело много глаз, искавших в них дыры.

Ваши варианты включают (по возрастанию уровня сложности)

Базовая аутентификация и HTTPS

Все зашифровано, что делает невозможным сжатие или просмотр, это несколько увеличивает накладные расходы, используя больше лошадиных сил на сервере и, возможно, больше заряда батареи на клиенте. Проста в реализации, поскольку хорошо поддерживается библиотеками.

Digest authentication

Незашифрованные сообщения передаются по проводам, но аутентификация надежно управляется в заголовках Authorization. Дополнительную информацию см. в Википедии.

OAuth

Посмотрите, как Google предоставляет OAuth для установленных приложений. Я считаю, что это не то, что вам нужно, поскольку вы не просите обмениваться данными между приложениями, а только аутентифицировать пользователей.

Создайте свой собственный

Если вы хотите создать свой собственный, я предлагаю посмотреть, как, например, работал ClientLogin от Google (теперь уже устаревший?).

  1. Клиенты получали GET защищенного ресурса, и получали 401 с инструкциями по выполнению аутентификации GoogleLogin, включая URI, где можно выполнить сам вход
  2. Клиенты (зная, как это сделать) отправляли запрос определенным образом на этот URI
  3. Сервер отвечал определенным ответом, включая (длинный) токен
  4. Теперь клиент может выполнять GET-запросы к защищенному ресурсу с этим токеном.

Нестационарность

Вы ссылаетесь на REST, который предписывает, что запросы не должны зависеть от предыдущего взаимодействия: "... каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для понимания запроса, и не может использовать преимущества какого-либо хранящегося на сервере контекста." (fielding) Это означает, что сервер не должен хранить контекст разговора (например, токен аутентификации) в таблице.

Один из способов исправить это - использовать любой из подходов, основанных на маркерах (когда сервер сообщает клиенту о маркере, который он должен использовать для будущих запросов), где маркер - это не случайное число, а сообщение самому серверу. Чтобы защититься от подделки со стороны клиента, его можно подписать, а если вы боитесь, что клиенты будут его просматривать, его можно зашифровать.

Edit: Хотя я не уверен, кажется маловероятным, что у Google есть таблица всех токенов аутентификации, когда-либо выданных; длина их токенов предполагает, что токен - это некоторое зашифрованное сообщение, доказывающее, что тот, кто владеет этим токеном, действительно предоставил реальные учетные данные в некотором царстве в определенное время.

6
ответ дан 2 December 2019 в 22:22
поделиться

OAuth делает именно то, что вы хотите, стандартным способом.

3
ответ дан 2 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: