Как реализовать вход в веб-сервис RESTful? - PullRequest
77 голосов
/ 05 января 2011

Я создаю веб-приложение со слоем сервисов. Уровень сервисов будет построен с использованием RESTful-дизайна. Предполагается, что когда-нибудь в будущем мы сможем создавать другие приложения (iPhone, Android и т. Д.), Которые используют тот же уровень сервисов, что и веб-приложение. У меня вопрос такой - как мне войти в систему? Я думаю, что у меня возникают проблемы при переходе от более традиционного дизайна на основе глаголов к проектированию на основе ресурсов. Если бы я строил это с помощью SOAP, у меня, вероятно, был бы метод, называемый Login. В REST у меня должен быть ресурс. Мне трудно понять, как мне создать свой URI для входа в систему. Должно ли это быть что-то вроде этого:

http://myservice/{username}?p={password}

РЕДАКТИРОВАТЬ: интерфейсное веб-приложение использует традиционную среду ASP.NET для проверки подлинности. Однако в какой-то момент в процессе аутентификации мне нужно проверить предоставленные учетные данные. В традиционном веб-приложении я бы сделал поиск в базе данных. Но в этом сценарии я вызываю службу, а не выполняю поиск в базе данных. Поэтому мне нужно что-то в службе, которая будет проверять предоставленные учетные данные. И в дополнение к проверке предоставленных учетных данных мне, вероятно, также понадобится некоторая информация о пользователе после его успешной аутентификации - такие как его полное имя, его ID и т. Д. Надеюсь, это прояснит вопрос.

Или я не думаю об этом правильно? Я чувствую, что мне трудно правильно описать свой вопрос.

Corey

Ответы [ 6 ]

59 голосов
/ 17 января 2011

Как уже указывал С.Лотт, у нас есть две сложенные вещи: логин и аутентификация

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

Клиент) Итак, все, что мне нужно, это токен доступа, но как получить такой RESTful?
Сервер) Почему бы просто не создать его?
Клиент) Как получается?
Сервер) Для меня токен доступа - это не что иное, как ресурс. Таким образом, я создам его для вас в обмен на ваше имя пользователя и пароль.

Таким образом, сервер может предложить URL-адрес ресурса "/ accesstokens", для отправки имени пользователя и пароля, вернув ссылку на вновь созданный ресурс "/ accesstokens / {accesstoken}". В качестве альтернативы вы возвращаете документ, содержащий токен доступа и ссылку со ссылкой на ресурс:

<access-token
  id="{access token id goes here; e.g. GUID}"
  href="/accesstokens/{id}"
/>

Скорее всего, вы на самом деле не создаете токен доступа как подресурс и, следовательно, не будете включать его href в ответ.
Однако, если вы это сделаете, клиент может сгенерировать ссылку от своего имени или нет? Нет!
Помните, что действительно веб-сервисы RESTful объединяют ресурсы таким образом, чтобы клиент мог самостоятельно перемещаться без необходимости создавать какие-либо ссылки на ресурсы.

Последний вопрос, который у вас, вероятно, возникнет, заключается в том, следует ли вы ПОСТАВИТЬ имя пользователя и пароль в виде HTML-формы или в виде документа, например, XML или JSON - это зависит ...: -)

24 голосов
/ 05 января 2011

Вы не «авторизуетесь».Вы «аутентифицируетесь».Мир различий.

У вас есть много вариантов аутентификации.

Базовая аутентификация HTTP, дайджест, NTLM и AWS S3

  • HTTP Basic и дайджест-аутентификация.Это использует заголовок HTTP_AUTHORIZATION.Это очень мило, очень просто.Но может привести к большому количеству трафика.

  • Имя пользователя / Подпись аутентификации.Иногда называется аутентификацией «ID and KEY».Это может использовать строку запроса.

    ?username=this&signature=some-big-hex-digest

    Это то, что используют такие места, как Amazon.Имя пользователя - это «id».«Ключ» - это дайджест, аналогичный тому, который используется для аутентификации дайджеста HTTP.Обе стороны должны согласовать дайджест, чтобы продолжить.

  • Какая-то аутентификация на основе файлов cookie.Например, OpenAM можно настроить как агент для аутентификации и предоставления файла cookie, который затем может использовать ваш веб-сервер RESTful.Сначала клиент будет проходить проверку подлинности, а затем предоставлять cookie-файл при каждом запросе RESTful.

1 голос
/ 05 июня 2015

Отличный вопрос, хорошо поставленный.Мне очень нравится ответ Патрика.Я использую что-то вроде

- / users / {username} / loginsession

с обработкой POST и GET.Поэтому я публикую новый сеанс входа в систему с учетными данными и затем могу просмотреть текущий сеанс как ресурс с помощью GET.

Ресурс является сеансом входа в систему, который может иметь маркер доступа или код авторизации, срок действия,и т. д.

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

Редактировать

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

Другое решение заключается в передаче токена, OAuth или JWT или иным образом, что означает, что «вход в систему» ​​уже выполнен другим процессом, вероятно,обычный пользовательский интерфейс входа в браузер, основанный на форме POST.

Мой ответ - для службы, которая находится за этим пользовательским интерфейсом, при условии, что вы хотите, чтобы вход в систему, аутентификация и управление пользователями были размещены в службе REST, а не вкод сайта MVC.Это служба входа пользователя в систему.

Она также позволяет другим службам "входить в систему" и получать токен с истекающим сроком вместо использования предварительно общего ключа, а также тестовые сценарии в CLI или Postman.

0 голосов
/ 25 февраля 2016

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

По первому вопросу вы можете разработать API Restfull. Учетные данные (имя пользователя и пароль) будут переданы на уровень обслуживания. Служебный уровень затем проверяет эти учетные данные и предоставляет токен. Учетные данные могут быть либо простым именем пользователя / паролем, либо SSL-сертификатами. SSL-сертификаты используют протокол OAUTH и являются более безопасными.

Вы можете создать свой URI следующим образом: URI для запроса токена-> http://myservice/some-directory/token? (Вы можете передать учетные данные в этом URI для токена)

Чтобы использовать этот токен для доступа к ресурсам, вы можете добавить [Authorization: Bearer (token)] в заголовок http.

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

По второму вопросу вы можете сделать следующее: вы предоставляете разные токены для доступа к различным компонентам ресурсов уровня обслуживания. Для этого вы можете указать параметр ресурса в своем токене и общее разрешение на основе этого поля.

Вы также можете перейти по этим ссылкам для получения дополнительной информации- http://www.codeproject.com/Articles/687647/Detailed-Tutorial-for-Building-ASP-NET-WebAPI-REST

http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

0 голосов
/ 12 июня 2013

Так как с 2011 года многое изменилось ...

Если вы открыты для использования стороннего инструмента и немного отклоняетесь от REST для веб-интерфейса, рассмотрите http://shiro.apache.org.

Широ в основном предоставляет вам фильтр сервлетов, предназначенный для аутентификации и авторизации. Вы можете использовать все методы входа в систему, перечисленные @ S.Lott, включая простую аутентификацию на основе форм.

Отфильтруйте остальные URL-адреса, требующие аутентификации, и Широ сделает все остальное.

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

Вот еще кое-что, что может заинтересовать людей. https://github.com/PE-INTERNATIONAL/shiro-jersey#readme

0 голосов
/ 05 января 2011

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

Обычно я обращаюсь с ним, используя ресурс входа в систему и передавая имя пользователя и пароль в строке параметров, в основном

GET для http://myservice/login?u={username}&p={password}

Ответом является некая строка сеанса или строки авторизации, которую затем можно передать другим API для проверки.

Альтернативой выполнению GET для ресурса входа в систему является выполнение POST, пуристы REST будутнаверное, не такой как я сейчас :), а переходящий в титры в теле.Ответ будет таким же.

...