В настоящее время я работаю над библиотекой REST для .net, и мне хотелось бы услышать некоторые мнения об открытой точке, которая у меня есть: REST и аутентификация.
Вот пример интерфейса RESTful, используемого с библиотекой:
[RestRoot("/user")]
public interface IUserInterface
{
[RestPut("/")]
void Add(User user);
[RestGet("/")]
int[] List();
[RestGet("/get/{id}")]
User Get(int id);
[RestDelete("/delete/{id}")]
void Delete(int id);
}
Затем код сервера просто реализует интерфейс, и клиенты могут получить один и тот же интерфейс через factory. Или, если клиент не использует библиотеку, также работает стандартный HTTP-запрос.
Я знаю, что существуют основные способы использования HTTP Basic Auth или отправки токена на запросы, требующие аутентифицированных пользователей.
Первый метод (HTTP Basic Auth) имеет следующие проблемы (частично веб-браузер):
- Пароль передается с каждым запросом - даже с SSL это имеет какое-то "плохое чувство".
- Поскольку пароль передается с заголовком запроса, локальному злоумышленнику было бы легко посмотреть на переданные заголовки, чтобы получить пароль.
- Пароль доступен в памяти браузеров.
- Нет стандартного способа истечения срока действия пользовательских сеансов.
- Вход в браузер прерывает внешний вид страницы.
Проблемы для второго метода более сфокусированы на реализации и использовании библиотеки:
- Каждый запрос URI, для которого требуется аутентификация, должен иметь параметр для токена, который является очень повторяющимся.
- Существует намного больше кода для записи, если каждая реализация метода должна проверить, действительно ли токен.
- Интерфейс станет менее конкретным, например.
[RestGet("/get/{id}")]
против[RestGet("/get/{id}/{token}")]
. - Где поставить токен: в конце URI? после корня? где-то еще?
Моя идея состояла в том, чтобы передать токен в качестве параметра в URL-адрес, например http:/server/user/get/1234?token=token_id
.
Другая возможность - отправить параметр в виде HTTP-заголовка, но это будет затруднять использование с помощью обычных HTTP-клиентов, которые, как я полагаю.
Токен будет передаваться обратно клиенту как пользовательский HTTP-заголовок ( "X-Session-Id" ) для каждого запроса.
Это может быть полностью абстрагировано от интерфейса, и любая реализация, нуждающаяся в аутентификации, может просто спросить, к кому принадлежит токен (если дано).
Считаете ли вы, что это слишком сильно нарушит REST или у вас есть идеи?