Авторизация запросов REST

Я работаю над службой REST, у которой есть несколько требований:

  1. Это должно быть безопасно.
  2. Пользователи не должны иметь возможность подделывать запросы.

Мое текущее предлагаемое решение состоит в том, чтобы иметь настраиваемый заголовок авторизации, который выглядит следующим образом (так же, как работают веб-службы Amazon):

Authorization: MYAPI username:signature

У меня вопрос, как оформить подпись. Когда пользователь входит в службу, ему выдается секретный ключ, который он может использовать для подписи запросов. Это остановит отправку запросов другими пользователями от их имени, но не помешает им подделывать запросы.

Приложение, которое будет использовать эту службу, является приложением для iPhone, поэтому я подумал, что мы могли бы иметь открытый ключ, встроенный в приложение, с которым мы можем сделать дополнительную подпись, но означает ли это, что нам нужно будет иметь две подписи, одну для пользовательского ключа и один для ключа приложения?

Любой совет будет очень признателен, я бы очень хотел сделать это правильно с первого раза.

Определите «запросы на подделку». Какая сущность создает неподдельные запросы? Это клиентское ПО?

Alexander 27.10.2008 23:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
1
5 121
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Я думаю, что самый простой способ сделать это правильно - использовать аутентификацию клиента HTTPS. На сайте Apple есть нить именно по этой теме.

Обновлено: для обработки авторизации я бы создал отдельный ресурс (URI) на сервере для каждого пользователя и разрешил бы только этому (аутентифицированному) пользователю управлять этим ресурсом.

Edit (2014): Apple изменила программное обеспечение для форумов за последние шесть лет; поток сейчас находится на https://discussions.apple.com/thread/1643618

Как это мешает пользователям подделывать запросы?

jonnii 27.10.2008 18:35

Для аутентификации клиента HTTPS требуется, чтобы у клиента был действующий сертификат открытого ключа. Если вы не имеете в виду под «подделкой запросов», что аутентифицированный пользователь каким-то образом делает неавторизованные запросы, что является проблемой авторизации, а не проблемой аутентификации.

Steven Huwig 27.10.2008 19:55

Это проблема, которую я пытаюсь решить, я обновил тему, чтобы отразить это. Как вы посоветуете разрешать действительные запросы?

jonnii 27.10.2008 20:29

@PeterMorris Вы собираетесь на -1 из-за неработающей ссылки в ответе шестилетней давности? Хороший.

Steven Huwig 31.10.2014 17:47

@StevenHuwig Да. Цель состоит в том, чтобы привлечь плакат (вас) обратно, чтобы вы могли исправить свой ответ, а затем, когда вы комментируете, говоря «Спасибо, я исправил», я удаляю -1. Это практика контроля качества, не более того :)

Peter Morris 31.10.2014 22:17

Кажется более конструктивным потратить тридцать секунд, которые я потратил на то, чтобы отследить исходную ссылку и опубликовать ее в комментарии или редактировании.

Steven Huwig 31.10.2014 22:18

Стивен, пожалуйста, поймите, что я всего лишь пытаюсь быть полезным. Тот факт, что этот ответ был опубликован 6 лет назад, не имеет значения. Так это факт, что у вас была такая же проблема 2 года назад и вы ее исправили. Проблема в том, что сегодня он сломан. Возможно, вы могли бы процитировать соответствующие части из ссылки на будущие ответы? Таким образом, неработающая ссылка даже не будет актуальной (я видел, как предлагался такой подход). А пока то, что вы делаете с этим, - ваш выбор, я только хотел сообщить вам.

Peter Morris 31.10.2014 23:00

Стивен, если вы хотите написать мне по электронной почте, чтобы обсудить это (mrpmorris в gmail), вы можете связаться со мной по Skype (mrpmorris) - мои действия не являются злонамеренными.

Peter Morris 31.10.2014 23:27

@PeterMorris Нечего обсуждать; вы игнорируете четко сформулированную цель отрицательных голосов, и, конечно же, я ничего не могу сделать, чтобы остановить это. Ваши намерения не имеют значения. stackoverflow.com/help/privileges/vote-down - «Используйте отрицательные голоса всякий раз, когда вы сталкиваетесь с вопиюще небрежным постом, не требующим усилий, или с ответом, который является явно и, возможно, опасно неверным».

Steven Huwig 01.11.2014 00:48

И каковы ваши намерения при просмотре моих ответов и их отрицательном голосовании? Соответствуют ли они опубликованной вами ссылке?

Peter Morris 01.11.2014 02:56

Они соответствуют вашему подходу к этому делу, поэтому, если вам не нравится такой подход, я предлагаю вам изменить его.

Steven Huwig 01.11.2014 05:01

Что не так с Дайджест-аутентификация HTTP?

Во-первых, мне придется использовать SSL для запросов (что нормально), но это не мешает пользователю войти в API с устройства, отличного от iPhone, и отправить поддельные запросы.

jonnii 27.10.2008 18:40

Как они могут подделать запрос с помощью дайджест-аутентификации? Как они получили текущее значение одноразового номера и создали приемлемый дайджест-ответ?

S.Lott 27.10.2008 19:03

Они могут подделать запрос, потому что они могут создать стороннее клиентское приложение, которое входит в API, после чего они могут отправлять свои собственные запросы. Мне нужно проверить источник запроса api.

jonnii 27.10.2008 19:13

Почему вы не можете использовать одноразовый номер клиента в ответе, который представляет собой строку подписи, уникальную для каждого iPhone?

S.Lott 27.10.2008 19:25

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

jonnii 27.10.2008 19:42

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

Johan Öbrink 01.05.2009 23:30

Ответ прост: это невозможно. Как только вы отправляете какое-либо решение конечному пользователю, он всегда может атаковать сервер, с которым общается. Самая распространенная разновидность этой проблемы - накрутка списков рекордов во флеш-играх. Вы можете сделать это Сильнее, встроив какое-то шифрование в клиент и запутав код ... Но весь скомпилированный и запутанный код всегда можно декомпилировать и разблокировать. Это просто вопрос того, сколько времени и денег вы готовы потратить, а также на потенциального злоумышленника.

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

В этом случае мы собираемся выполнить развертывание на iphone, поэтому есть риск, что кто-то декомпилирует код. Вы поднимаете очень веские вопросы в своем сообщении об ограничении возможности повредить только данные пользователей, в этом случае они смогут обмануть в игре, поэтому нам нужно иметь возможность выявлять читеров и эффективно бороться с ними. Задача непростая.

jonnii 01.05.2009 21:47

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

Johan Öbrink 01.05.2009 23:23

Если вы разрабатываете ИГРУ, и это проблема ОБМАНА, то у вас есть целый ряд других инструментов, доступных вам - в зависимости от того, будет ли это игра на ловкость или азартная игра. Вообще говоря, производительность игроков можно измерить статистически и выявить странные закономерности - именно столько систем обнаружения мошенничества работает в индустрии развлечений. Еще одна вещь, которая сразу приходит в голову, - это алгоритмический дизайн, который привносит в игру определенные измеримые свойства - например, накопление ошибок в числах с плавающей запятой.

mst 29.12.2009 20:03

Другие вопросы по теме