2016-04-05 3 views
0

Я разрабатываю приложение, которое взаимодействует с бэкэнд только через API RESTful. Теперь моя аутентификация/авторизация основана на протоколе OAuth2. Мне интересно, достаточно ли это.Является ли мой пароль OAuth2 достаточно безопасным?

Мой рабочий Логин/выход из системы:

  1. Номер вызова API, чтобы запросить маркер доступа. Информация включает: app_key, app_secret, username, password, grant_type. Храните этот токен в локальном хранилище, указав, что этот пользователь вошел в систему.
  2. При запросе некоторых ограниченных ресурсов, таких как /api/profile, интерфейсный модуль отправляет запрос Ajax с token в заголовок запроса: Authorization [token].
  3. Бэкэнд извлекает текущего пользователя из token и решает, разрешать ли его.
  4. Для выхода из системы просто удалите токен из локального хранилища.

Я планирую добавить кодировку HTML (для защиты от XSS) и HTTPS (чтобы предотвратить взрыв токена).

Мне интересно, такой «простой» механизм, достаточно ли он защищен, чтобы защитить мой сайт от обычных атак, таких как CSRF?

ответ

2
  1. Вы отправляете app_secret с клиента. Это означает, что у клиента есть app_secret, и, следовательно, он просочился кому-либо, использующему сайт.

  2. Для OAuth2 он должен быть Authorization: bearer [token]

  3. OAuth2 не предназначен для аутентификации, авторизации только. Возможно, вы захотите рассмотреть OpenID-соединение, основанное на OAuth2. Токен дает владельцу доступ к выполнению какого-либо действия, но доказывает, что запросчик фактически является пользователем или кем-то, делегированным пользователем. Рассмотрим дорогой автомобиль с ключом камердинера. Этот ключ является токеном с ограниченным доступом к автомобилю. Любой, кто держит этот токен, может управлять автомобилем (авторизация). Однако назначение этого токена не подтверждает право собственности на автомобиль (аутентификация).

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

OAauth2 требует HTTPS, так что должно быть на месте.

+0

Спасибо @Erlend. Но OAuth2 не для аутентификации? Я пытаюсь получить систему, похожую на учетную запись Google. Тогда учетная запись Gmail может выполнять аутентификацию, не так ли? Другое дело, я думаю, что клиент прекрасно знает секрет, так как клиент должен зарегистрировать приложение в моей системе, прежде чем войти в систему. Клиент несет ответственность за то, чтобы приложение было безопасным, как приложение Google. Я прав? – Joy

+0

Ваши баллы 2 и 4 определенно имеют смысл, спасибо. – Joy

+0

Google использует соединение OpenID: https://developers.google.com/identity/protocols/OpenIDConnect (он построен поверх OAuth 2) – Erlend