Я начинаю создавать веб-службу REST, и я не знаю, как лучше подойти к аутентификации. Служба позволит отдельным пользователям получать доступ к своим собственным данным и управлять ими, поэтому требуется некоторый тип аутентификации пользователя. Я рассматривал следующие варианты:
- OAuth
OAuth больше похоже на авторизацию вместо аутентификации. Я планирую самостоятельно обрабатывать авторизацию внутри служб, поэтому не ищут решения для этого. Но подходит ли OAuth для аутентификации?
- OpenID
OpenID, безусловно, предоставляет решение для аутентификации, но это больше связано с тем, что пользователи могут использовать свои сторонние учетные данные (Google, Yahoo и т.д.). Хотя я хотел бы поддержать это, это не является основной заботой для меня, и я обязательно разрешу пользователям регистрироваться с учетными данными (email/password).
- Базовая аутентификация HTTP
Это просто реализовать, но я понимаю, что это может быть не очень безопасный метод. Кроме того, как представляется, требуется обмен учетными данными для каждого доступа, но я бы предпочел, чтобы пользователь аутентифицировался один раз, а затем продолжал доступ через токен сеанса.
- Пользовательская аутентификация
В принципе, сверните мою собственную службу генерации логина/маркера и потребуйте действительный токен для доступа ко всем другим ресурсам (очевидно, все будет за SSL).
Помимо создания веб-сервисов, я также создаю клиентское (веб-приложение), которое использует эти службы от имени пользователя, но я не хочу, чтобы приложение хранило информацию пользователя/учетные данные/и т.п. Итак, что-то вроде этого:
Пользователь (аутентифицируется с помощью электронной почты/пароля или сторонних учетных данных) → Веб-приложение (аутентифицируется с идентификатором приложения) - > Веб-службы
И снова я хочу разрешить другим создавать клиенты, поэтому средний уровень может быть любым сторонним приложением:
Пользователь (аутентифицируется с помощью электронной почты/пароля или сторонних учетных данных) → стороннее приложение (аутентифицируется с идентификатором приложения) - > Веб-службы
Мои самые высокие требования:
- Безопасность (очевидно)
- Собственные учетные данные
- Поддержка сторонних учетных данных (Google, Yahoo, LinkedIn и т.д.)
- Поддержка нескольких клиентов (веб-приложение, мобильное приложение, сторонние приложения и т.д.).
- Учетные данные клиента (только идентификатор приложения?)
- Время входа в систему, срок действия которого истекает
- Авторизация не требуется
Итак, мой вопрос основан на вышеизложенном (пожалуйста, дайте мне знать, если это слишком расплывчато), существует ли "лучший" подход? Являются ли OAuth или OpenID подходящими, или я делаю это слишком сложным, и вместо этого нужно просто запустить мою собственную проверку подлинности?
EDIT:
Думаю, мне нужно реализовать следующее:
1) Собственные учетные данные/токены (HTTP basic auth over SSL?)
2) OpenID "Relying Party", чтобы позволить api использовать OpenID, размещенные в другом месте (т.е. "поддержка сторонних учетных данных" )
3) OAuth "Потребитель", чтобы позволить моему api получить доступ к сторонним службам (например, получить доступ к профилю LinkedIn пользователя).
4) Провайдер OpenID, позволяющий людям использовать собственные идентификаторы api в другом месте (необязательно)
5) Поставщик OAuth, чтобы позволить сторонним приложениям получать доступ к моему api от имени пользователя (необязательно)
Это кажется правильным, или я делаю это более сложным, чем это должно быть?