#saml #hybris #spartacus-storefront
Вопрос:
Мы написали индивидуальный подход к интеграции потока входа SAML с Hybris и Spartacus в следующей последовательности.
Поток последовательностей :
- Пользователь перенаправляется на IDP (OKTA), так как сеанс аутентификации отсутствует
- Пользователь войдет в систему на странице входа в систему IDP, а затем запрос будет перенаправлен на Hybris вместе с утверждениями SAML
- На конце Hybris Hybris проверит эти утверждения и сгенерирует «Токен входа» (Код аутентификации) и перенаправит на Spartacus
- На конце Spartacus он определит, существует ли «LoginToken», и если он существует, spartacus отправит этот логин в Hybris, а Hybris вернет access_token, который затем будет установлен в локальном хранилище браузера.
Мы написали контроллер клиента, который примет LoginToken в качестве параметра и вернет access_token в ответе. Мы использовали приведенный ниже код в Spartacus для реализации этого и установили access_token в локальном хранилище браузера. Но проблема в том, что spartacus отправляет запрос на отзыв токена Hybris при доступе к любой из страниц Spartacus, и ключ доступа очищается.
**
- Как правильно настроить access_token в spartacus, если мы используем пользовательский контроллер для создания OAuth ?
- Или есть другой подход, который мы должны использовать при создании и сохранении access_token в Spartacus ?**
Фрагмент кода :
ngOnInit() { var LoginToken = this.cookies.get('LoginToken'); var authToken= JSON.parse(localStorage.getItem('spartacus⚿⚿auth')).token.access_token; var mainToken= JSON.parse(localStorage.getItem('spartacus⚿⚿auth')); console.log('token value ' authToken); if(!authToken amp;amp; !LoginToken) { console.log("Make call to Hybris for OAuth token"); let fetchUrl ='https://localhost:9002/occ/v2/{baseSite}/ssoauthenticate/?client_id=mobile_android'; this.http.post<any>(fetchUrl,"",{withCredentials:true,headers:{"Access-Control-Allow-Origin":"*"}}).subscribe(data => { console.log(data.value); mainToken.token.access_token=data.value; mainToken.token.granted_scopes=data.scope; mainToken.token.token_type=data.tokenType; mainToken.token.expires_at=1631632676508; mainToken.userId="current"; localStorage.setItem('spartacus⚿⚿auth',JSON.stringify(mainToken)); }); } if(!authToken amp;amp; LoginToken) { console.log("Redirect for SSO"); window.location.href="https://localhost:9002/samlsinglesignon/saml/sso/"; }
Ответ №1:
Существует существующий модуль интеграции для SAP Customer Data Cloud, который реализует этот шаблон (пакет расширений SAP Cloud: https://help.sap.com/viewer/bad9b0b66bac476f8a4a5c4a08e4ab6b/v1905/en-US/4658aaba5ff242ab99f2f89aa1a51ec8.html, начиная с 2005 года, он входит в пакет расширений интеграции: https://help.sap.com/viewer/b6a1e8b75222421a8faf0269e8fbd0dc/2102/en-US/f9df5c14bfdf47349dc9b82de84a574f.html)
Однако в документах на самом деле не говорится: чтобы включить это, была изменена возможность OAuth для поддержки реализаций CustomTokenGranter. Интеграция SAP CDC затем основывается на этом, чтобы обеспечить логику, специфичную для CDC, в этой области.
Вам нужен токен OAuth для доступа к API OCC, и он должен быть выдан с помощью функций SAP Commerce OAuth. Однако в случае CDC вход осуществляется с помощью автоматически сгенерированных экранов, которые все работают на уровне браузера. В широком смысле: процесс входа в CDC происходит между экранами в браузере серверами CDC, компоненты-оболочки в Spartacus принимают вывод (назовите его токеном входа, если хотите) и передают его в запрос токена OAuth. CustomTokenGranter, реализованный в интеграции CDC, затем проверит этот токен на серверной части, чтобы OAuth мог выдать действительный токен аутентификации обратно в Spartacus. Затем Spartacus использует этот токен в любых вызовах OCC API точно так же, как он обрабатывает стандартный токен аутентификации.
Здесь есть аналогии с вашим процессом с Okta, и вы могли бы сделать что-то подобное (с точки зрения процесса). В этих сценариях вы действительно должны иметь внутреннюю интеграцию с вашим IdP … для проверки токенов на стороне сервера и предотвращения подмены.
Сторона этой интеграции Spartacus является открытым исходным кодом, как и в остальной части проекта Spartacus. Вы можете найти код здесь: https://github.com/SAP/spartacus/tree/develop/integration-libs/cdc