官网

从一开始,Spartacus 就包含了客户端身份验证和用户身份验证。 尽管这对于 Web 应用程序来说并不常见,但对于 Spartacus 来说是必须的,因为后者需要使用 OCC API。

客户端身份验证涉及代表已注销用户工作的 endpoint,例如注册、重置密码、以访客身份下订单和验证地址。这些 endpoint 需要随请求一起发送访问令牌,并且需要按照 OAuth 规范定义的客户端凭据流来检索此访问令牌。换句话说,某些 OCC 请求需要客户端凭据流 - Client Credentials Flow,因此您需要在 OAuth 客户端中启用此流。

注意:在 OAuth 客户端中启用客户端凭据流时,应始终将 ROLE_CLIENT 与 Spartacus OAuth 客户端一起使用。永远不要将 ROLE_TRUSTED_CLIENT 与 Spartacus 一起使用,因为它会显着危害应用程序的安全性。

同时,用户认证 - user authentication, 用于代表特定用户资源发送的请求。例如,如果您想更新您的个人资料,您需要登录。当您登录时,服务器会确认您的凭据 - credentials, 并向应用程序返回访问令牌。然后,此令牌将用于您帐户上的所有请求,例如更新您的个人资料、修改购物车和结帐。

在 Spartacus 3.0 之前,客户端身份验证和用户身份验证的代码都在 AuthModule 中,其中包括混合在一起的拦截器、服务和外观方法。在 Spartacus 3.0 中,AuthModule 仍然包含客户端和用户身份验证,但现在这是导入 UserAuthModule 和 ClientAuthModule 两个模块的结果。每个模块负责一种类型的身份验证。

此更改很重要,因为 Spartacus 默认构建为支持 OCC,但 Spartacus 不限于使用 OCC。 OCC API 需要为其接收的某些请求提供客户端凭据,但这对于其他 API 并不常见,因此,客户端和用户身份验证已分离,以便更轻松地与其他 API 一起使用。例如,如果您使用不需要客户端身份验证的其他 API,则可以只导入 UserAuthModule,而不是使用 AuthModule,并通过不包含 ClientAuthModule 来减小最终包的大小。

Authentication Flow

对用户进行身份验证是该模块的主要职责。 先前版本的 Spartacus 使用自定义代码来提供对资源所有者密码流的支持,但 OAuth 指定了可在 Web 应用程序中使用的其他流。 为了支持这些额外的流程,Spartacus 3.0 不再将其自定义代码用于资源所有者密码流程,而是依赖于为此目的构建的第三方 angular-oauth2-oidc 库,该库也经过了良好的测试和认证。

身份验证从 AuthService facade 开始,您可以在其中通过调用以下登录方法之一来初始化流程:

  • Resource Owner Password Flow 的 loginWithCredentials
  • loginWithRedirect 用于隐式流或授权代码流 - Implicit Flow or the Authorization Code Flow

然后 login 方法与 angular-oauth2-oidc 库交互。 但是,这种交互始终通过 OAuthLibWrapperService,这是一个用于将外部库与 Spartacus 代码隔离的层。

Storing Tokens and User Identifiers

身份验证后,从库方法收到的令牌需要存储在某个地方。 以前,这些代币保存在 NgRx Store 中,但在 Spartacus 3.0 中,有专门的服务来保存数据。 该库需要一个带有类似于 localStorage 或 sessionStorage 的 API 的存储机制,这是从 NgRx 切换到带有流的服务来保存数据的主要原因。

对于身份验证,通常仅存储令牌及其元数据(例如到期时间和范围)就足够了。 但是,对于 OCC,还需要在登录或注销后设置紧密耦合的用户 ID,以及在使用辅助服务模块 (ASM) 时进行用户模拟所需的用户 ID。 在 Spartacus 3.0 之前,用户 ID 与 NgRx 中的令牌保存在同一位置,并且由于之前的关联,用户 ID 仍保留在 UserAuthModule 中。 但是,令牌现在已与此模块中的用户标识符分开。 令牌及其元数据现在与 AuthStorageService 一起存储,而用户 ID 则拥有自己的专用 UserIdService。

Access Tokens in API Calls and Error Recovery

登录用户并存储他们的访问令牌和用户 ID 后,就可以请求用户的一些资源。为此,有必要在请求中将访问令牌作为标头传递。 在 Spartacus 中,这是通过 HTTP 拦截器实现的。

要使用访问令牌丰富请求,您无需以任何方式标记请求。 AuthInterceptor 根据 URL 识别对 API 的请求。如果请求没有 Authorization 标头,并且匹配 API 路径,则拦截器将标头添加到请求中。为了更容易扩展拦截器,Spartacus 有自己的 AuthHttpHeaderService 帮助服务。在大多数情况下,扩展这一项服务就足够了。

除了注入令牌之外,该拦截器还负责处理与授权相关的错误。在这种情况下,它首先尝试恢复并重试请求,如果不可能,它完成注销过程并将用户重定向到登录页面。当请求因访问令牌过期而失败时,拦截器使用刷新令牌(如果存在)请求新的访问令牌,然后使用新令牌重试失败的请求。

第二个 TokenRevocationInterceptor 拦截器具有非常特殊的作用。对于在用户注销时撤销令牌的调用,此拦截器添加了一个 Authorization 标头。使用不同的 OAuth 服务器,您可能不需要提供此标头,并且可以从您自己的 UserAuthModule 中删除此拦截器。

Persisting Authentication Data in the Browser Storage

登录后,您的令牌已被存储并用于 API 调用,您刷新页面,突然您不再登录。 为避免此问题,AuthStatePersistenceService 将身份验证数据(例如令牌和用户 ID)同步到 浏览器存储。

AuthStatePersistenceService 使用 StatePersistenceService 来与浏览器存储同步数据。 UserIdService 中的用户 ID、AuthStorageService 中的令牌和 AuthRedirectStorageService 中的重定向 URL 都同步到 localStorage。 每次数据发生变化时,都会保存在浏览器存储中,应用启动时从存储中读取到服务中。

@NgModule({// ClientAuthModule should always be imported after UserAuthModule because the ClientTokenInterceptor must be imported after the AuthInterceptor.// This way, the ClientTokenInterceptor is the first to handle 401 errors and attempt to refresh the client token.// If the request is not for the client token, the AuthInterceptor handles the refresh.imports: [CommonModule, UserAuthModule.forRoot(), ClientAuthModule.forRoot()],

ClientAuthModule 应该总是在 UserAuthModule 之后导入,因为 ClientTokenInterceptor 必须在 AuthInterceptor 之后导入。

这样,ClientTokenInterceptor首先处理401错误并尝试刷新客户端令牌。

如果请求不是针对客户端令牌,则 AuthInterceptor 处理刷新。

参考:https://github.com/SAP/spartacus/pull/13280/files

SAP Spartacus 的会话管理 Session Management相关推荐

  1. 58. 通俗易懂的 SAP ABAP 会话管理(Session Management)概念讲解,包含具体的实例

    文章目录 用户会话 ABAP 会话 内部会话(Internal Session) 总结 本教程之前的步骤,给大家介绍了如何通过 F1 快捷键,打开 ABAP 帮助文档的方法: 57. SAPGUI 里 ...

  2. bboss 会话管理session操作使用示例

    bboss 会话管理session操作使用示例(遵循servlet标准规范): HttpSession session = request.getSession();//request.getSess ...

  3. PHP会话管理——Session和Cookie

    会话管理包括:Session和Cookie,主要功能都是把客户端和服务器关联起来,用于管理和查看用户在网站中的状态. 背景 Web应用程序是使用HTTP协议传输数据的.HTTP协议是无状态的协议.一旦 ...

  4. 219. 单页应用 会话管理(session、cookie、jwt)

    原文链接:https://github.com/ly525/blog... 关键字:http-only, cookie,sessionid, vue-router, react-router, 安全, ...

  5. 【移动网络】5GC:5G核心网络的会话管理(Session Management)

    Session Management SMF的功能 基本的PDU会话连接 PDU会话建立 隧道与传输连接 PDUs Type SSC (Service and Session Continuity) ...

  6. Java中的会话管理– HttpServlet,Cookie,URL重写

    Session Management in Java Servlet Web Applications is a very interesting topic. Session in Java Ser ...

  7. SAP Commerce Cloud UI(Spartacus Storefront) 的用户会话管理

    这是 Jerry 2021 年的第 51 篇文章,也是汪子熙公众号总共第 328 篇原创文章. 如无特殊说明,本公众号介绍的 SAP Commerce Cloud UI,均指新一代基于 Spartac ...

  8. SAP Commerce Cloud UI 的用户会话管理

    这是 Jerry 2021 年的第 51 篇文章,也是汪子熙公众号总共第 328 篇原创文章. 如无特殊说明,本公众号介绍的 SAP Commerce Cloud UI,均指新一代基于 Spartac ...

  9. 5G NGC — 会话管理模型 — PDU Session

    目录 文章目录 目录 5G 的会话管理模型 PDU Session PDU Session 的类型 Ethernet Type Unstructured Type DNN 的作用 UE IP 地址的分 ...

最新文章

  1. objdump查看目标文件构成
  2. 天津计算机考研901,2013年天津大学901计算机考研真题
  3. 【华为云技术分享】程序员真香定律:源码即设计
  4. Kotlin学习笔记 第四章Kotlin调用Java
  5. java flink项目_IDEA上运行Flink任务的实战教程
  6. ARM开发7.3.3 基础实训( 3 ) 独立式键盘的输入系统设计--LPC21XX
  7. Hibernate 二级缓存的作用
  8. 程序员工作交接文档怎么写_你认为程序员需不需要写文档?需要写哪些文档?...
  9. 微信小程序轮播图实现
  10. CPU的内部架构和工作原理(转)
  11. 红色警戒2修改器原理百科(九)
  12. FastAPI 是什么?
  13. 4939-大整数排序 ZCMU
  14. 【git】cherry-pick详解
  15. 【NLP】文本分类算法-基于字符级的无词嵌入双向循环神经网络(双向 GRU)
  16. 非线性规划的对偶问题
  17. python自动生成字幕_深度学习实现自动生成图片字幕
  18. guid分区怎么装win7_如何在GUID分区装win7系统并以UEFI启动?
  19. C语言结构体error: invalid use of incomplet type ‘ struct people’
  20. BUUCTF [极客大挑战 2019] PHP

热门文章

  1. 【ZJOF】用来个栈来实现一个队列
  2. 图解HashMap(一)
  3. 不止性能优化,移动端 APM 产品研发技能
  4. [zz]GMM-HMM语音识别模型 原理篇
  5. Facebook利用Home平台加速进军移动领域
  6. ASP.NET,IE6下URL中文乱码问题
  7. IntelliJ IDEA 2019 激活码 | 全产品 | 跨平台 | Goland | PhpStorm | Rider | CentOS | Windows
  8. AngularJs详细
  9. 史上最详细 纯CSS打造3D文本滚动
  10. ios7 uuid的获取方法