Подтвердить что ты не робот

Как я могу реализовать проверку подлинности?

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

Кроме того, я стараюсь как можно больше соответствовать архитектуре REST.

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

Есть ли способ соответствовать REST без использования файлов cookie?

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

Схема аутентификации для клиента android:
ВАРИАНТ a
1. Укажите имя пользователя/пароль через https в веб-службе
2. Веб-сервис возвращает уникальный токен авторизации (сохраняйте токен в таблице имени пользователя /pwd в хранилище данных)
3. Запросить последующие услуги, добавив этот токен в заголовок запроса запроса
4. Сервер отображает токен в таблицу имени пользователя /pwd и возвращает данные, если найден токен
5. Ток авторизации истекает через определенный промежуток времени

ВАРИАНТ b
1. Настройте секретный ключ на стороне клиента и сервера
2. Используйте "имя пользователя: хэш пароля и секретный ключ" в заголовке авторизации каждого запроса
3. сервер генерирует пароль, извлекая пароль из хэш-значения, используя тот же алгоритм хеширования; при успешном возврате данных
Кстати, я не хотел использовать базовую авторизацию из-за ее уязвимостей безопасности.

Что лучше?

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


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

Теперь шаги будут следующими:
1. Создайте подпись с помощью oauth_parameters (consumer_key, signature_method, timestamp), URL запроса, параметров запроса и SECRET.
2. При подаче запроса укажите параметры подписи, oauth.
3. Сервер проверяет запрос, создавая подпись снова, за исключением того, что в этом случае он использует SECRET, который соответствует ключу

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

Каковы плюсы и минусы при этом?

4b9b3361

Ответ 1

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

Ваши варианты включают (в возрастающий уровень сложности)

Обычная проверка подлинности и HTTPS

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

Аутентификация дайджеста

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

OAuth

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

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

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

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

Безгражданство

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

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

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

Ответ 2

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

Ответ 3

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