Представьте себе следующий общий сценарий.У меня есть одностраничное веб-приложение (SPA), которое получает все свои данные с помощью API-интерфейсов RESTful, которые я написал на бэкэнде.
Эти API-интерфейсы также доступны сторонним разработчикам, как и прежде.Мое одностраничное приложение - еще одно из миллионов, использующих API.Сеанс поддерживается в фоновом режиме для удобства аутентификации и кэширования.Сеанс сохраняется через cookie с идентификатором сеанса.
Чтобы использовать API, пользователь должен пройти аутентификацию.Мне нужно поддерживать большой метод SSO (OIDC / OAUTH2) для моего приложения.Очевидно, что мои API должны использоваться программным обеспечением для интеграции, таким как Dell Boomi или обычная SSIS.
Теперь ... давайте поговорим об аутентификации и авторизации.После нескольких дней чтения всего, что я мог на OAuth2 и OpenID, я представляю следующий рабочий процесс.myapp.com настроен на единый вход через Facebook (произвольно):
- [Веб-браузер]:
GET /customer/1
> [Сервер API] - [Сервер API]:
Dunno you, chump. 302 redirect here, plz.
>[Браузер] https://www.facebook.com/oauth/login?client_id=abcdef&state=12345 - [Браузер]:
Username: lintlicker, password: iluvcats123
> [Facebook] - [Facebook]:
Yup, you're someone. 302 redirect here, plz.
> [Браузер] https://www.myapp.com/oauth/imback?code=a1b2c3d&state=12345 - [Веб-браузер]:
json of the stuff from the url
> [Сервер API] - [Сервер API]:
Here's a code and client-id and client-secret
> [Facebook] - [Facebook]:
Here's a token to run Facebook APIs for this user
................................
Но, подождите.Я не хочу запускать API Facebook.Я просто хочу аутентифицироваться с помощью Facebook, а затем запустить API моего приложения ... Уже вы можете видеть, что я неправильно понял OAuth по сравнению с OIDC.
Хорошо, тогда Facebook является аутентификатором, использующим OpenID.Но как насчет OAuth для внешнего использования моих API?
Должен ли мой сервер API в основном пересылать OAuth-запрос от браузера / запросчика тому, кто является поставщиком удостоверений?И затем вместо идентификатора сеанса в файле cookie я отправляю обратно токен доступа, срок действия которого истекает, например, через час, а также токен обновления?Тогда браузер отвечает за повторное извлечение токена?
Означает ли это, что браузер или запросчик имеют секрет клиента?Очевидно нет.Так значит ли это, что я должен использовать / поддерживать устаревший метод неявного предоставления ?
Какая здесь хорошая архитектура?