首页 > 解决方案 > OAuth 令牌在 Spartacus 上被撤销

问题描述

我们编写了一个将 SAML 登录流程与 Hybris 和 Spartacus 集成的自定义方法,其顺序如下。

序列流:

  1. 由于没有身份验证会话,用户被重定向到 IDP (OKTA)
  2. 用户将登录 IDP 登录页面,然后请求与 SAML 断言一起被重定向到 Hybris
  3. 在 Hybris 端,Hybris 将验证这些断言,并将生成“登录令牌”(身份验证代码)并将重定向到 Spartacus
  4. 在 Spartacus 端,它将识别是否存在“LoginToken”,如果存在,spartacus 将将此 LoginToken 发送给 Hybris,Hybris 将返回 access_token,然后将其设置在浏览器的 localStorage 中。

我们编写了一个客户控制器,它将LoginToken作为参数,并在响应中返回 access_token。我们在 Spartacus 中使用了以下代码来实现这一点,并在浏览器的 localStorage 中设置 access_token。但问题是 spartacus 在访问任何 Spartacus 页面时向 Hybris 发送令牌撤销请求,并且 access_token 正在被清空。

**

  1. 如果我们使用自定义控制器生成 OAuth,在 spartacus 中设置 access_token 的正确方法是什么?

  2. 或者我们应该采取不同的方法来生成和持久化 Spartacus 中的 access_token 吗?**

    代码片段:

    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 && !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 && LoginToken) {
        console.log("Redirect for SSO");
        window.location.href="https://localhost:9002/samlsinglesignon/saml/sso/";
       }
    

标签: samlhybrisspartacus-storefront

解决方案


现有的 SAP Customer Data Cloud 集成模块可实现此模式(1905 Cloud Extension Pack: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 令牌来访问 OCC API,并且需要从 SAP Commerce OAuth 功能发出。然而,在 CDC 案例中,登录是通过自动生成的所有在浏览器级别工作的屏幕设置。概括地说:CDC 登录过程位于浏览器中的屏幕设置 + CDC 服务器之间,Spartacus 中的包装器组件获取输出(如果您愿意,将其称为登录令牌)并将其传递到 OAuth 令牌请求中。然后,在 CDC 集成中实现的 CustomTokenGranter 将在后端验证该令牌,以便 OAuth 可以将有效的身份验证令牌发回给 Spartacus。然后,Spartacus 在任何 OCC API 调用中使用该令牌,就像它处理标准身份验证令牌一样。

这里有一些与 Okta 的流程类似的地方,您可以做类似的事情(就流程而言)。在这些情况下,您确实应该将后端集成到您的 IdP ......以在服务器端验证令牌并防止欺骗。

与 Spartacus 项目的其余部分一样,此集成的 Spartacus 方面是开源的。你可以在这里找到代码:https ://github.com/SAP/spartacus/tree/develop/integration-libs/cdc


推荐阅读