#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 является паролем. Если вы выполните его, будет безопасно вернуть только токен доступа:
Сервер авторизации выдает токен доступа и необязательный токен обновления и создает ответ, добавляя следующие параметры в тело объекта 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. Спасибо за вашу помощь, Свабаэль.