Достаточно ли безопасна проверка последующего запроса REST API с помощью токена?

#rest #security

#rest #Безопасность

Вопрос:

В моем REST API пользователь впервые войдет в систему под своим именем пользователя и паролем.

Когда они успешно войдут в систему, мы ответим в следующем формате.

 {
  "token": "0c7f8b870675bc61d92baeef1e274c2d31343736393530373230",
  "expire_on": "2016-11-19T18:05:20 0000",
  "user_id": 30,
  "user": {...}
}
  

В следующем за REST API мы просто отправим token заголовок для проверки пользователя. token это 52 длинные буквы.

Достаточно ли это безопасно?

Должен ли я отправлять оба token и user_id для проверки, чтобы обезопасить больше?

Ответ №1:

Это зависит от того, как вы генерируете свой токен. Если кто-то может догадаться, как они генерируются, он может создать поддельный. Если это случайная строка, которая сохраняется на вашем сервере, и для каждого запроса вы проверяете ее существование на своем сервере, тогда вы в безопасности. Лучшим текущим решением для токена без состояния является JWT. Взгляните на https://jwt.io /

Ответ №2:

Реализовали ли вы свой уровень аутентификации? Я бы посоветовал взглянуть на спецификацию Oauth2, и вас интересует раздел, в котором grant_type является паролем. Если вы выполните его, будет безопасно вернуть только токен доступа:

5.1. Успешный ответ

Сервер авторизации выдает токен доступа и необязательный токен обновления и создает ответ, добавляя следующие параметры в тело объекта HTTP-ответа с кодом состояния 200 (OK):

ТРЕБУЕТСЯ access_token. Токен доступа, выданный сервером авторизации.

ТРЕБУЕТСЯ token_type. Тип выданного токена, как описано в разделе 7.1. Значение не зависит от регистра.

РЕКОМЕНДУЕТСЯ ИСПОЛЬЗОВАТЬ expires_in. Время жизни токена доступа в секундах. Например, значение «3600» означает, что токен доступа истечет через час с момента генерации ответа. Если этот параметр опущен, сервер авторизации ДОЛЖЕН указать время истечения срока действия другими способами или задокументировать значение по умолчанию

.

Комментарии:

1. Должен ли я использовать Oauth для аутентификации моего собственного клиента и моего собственного сервера? Я думал, что OAuth предназначен для аутентификации входа в систему между приложениями?

2. @moeseth Oauth2 предоставляет разные типы предоставления. Grant_type, который используют кросс-приложения, называется ‘authorization’. В спецификации oauth2 также упоминается grant_type ‘password’, который можно использовать для прямого обмена именем пользователя и паролем на токен доступа. Просто будьте немного осторожны при его использовании, если у вас уже есть сервер oauth. Вы можете посмотреть здесь для получения дополнительной информации: oauthlib.readthedocs.io/en/latest/oauth2/grants/password.html и здесь aaronparecki.com/2012/07/29/2/oauth2-simplified

3. @moeseth Этот ресурс также может быть полезен: apigility.org/documentation/auth/authentication-oauth2 в разделе «Доступ по имени пользователя и паролю»

4. Спасибо за вашу помощь, Свабаэль.