无法理解如何使用 openidConnectClient-1.0 功能和使用 REST API 端点的 Angular 应用程序来处理 OpenID 协议

Can't understand how to work with OpenID protocol using openidConnectClient-1.0 feature and Angular application which using REST API endpoints

所以,我有一个 WAS Liberty server which configured to work with OpenID provider。然后我有一个 Angular 应用程序,它大量使用 REST Api 端点。 当我第一次打开应用程序或在令牌过期后打开它时,一切正常,WAS 将我重定向到 OpenID 提供程序,然后是 OpenID 定义的常规流程,并由 openidConnectClient-1.0 实现支持。

但是我应该如何关心以下用例:应用程序打开时令牌已过期,用户发出 GET 或 POST 请求而不重新加载应用程序?现在 WAS 也执行重定向,所以我实际上无法区分常规响应和重定向(return 状态 200)。

我想到的唯一解决方案是让 Websphere 不要对某些端点执行重定向,而是 return 401/403 错误。所以我将能够在我的客户端监控响应代码并相应地执行。有可能实现吗?也许还有另一种我不知道的解决方案?


Update:在我写完这个之后,我考虑使用 Authentication Filters,即定义如下:

<authFilter id="testFilter">
        <webApp id="simple" matchType="contains" name="simple"/>
        <requestUrl id="excludeUrl1" matchType="notContain" urlPattern="/basic"/>
        <requestUrl id="excludeUrl1" matchType="notContain" urlPattern="/api"/>
    </authFilter>

但我立即看出这种方法有两个缺点:

  1. 在两个不同的地方维护应用程序的逻辑,server.xml 和应用程序本身。它会使应用程序的维护非常麻烦。
  2. 由于 Authentication Filters 的性质,它将回退到另一个 registry 来执行登录。它可能是一个安全漏洞。

更新 2: 上面的解决方案不起作用。当服务器 returns 401 错误以及 www-authenticate header 时,浏览器显示基本身份验证弹出窗口,请参阅下面建议的解决方案。

为了解决这个问题,我使用了 Angular's Interceptors,我检查响应中是否有以下 headers:no-cache, no-store, must-revalidate, private, max-age=0。如果他们坚持响应,我知道 session 已过期并重新加载我的应用程序。

重新加载时,liberty 本身将其重定向到 SSO 提供程序。另一种解决方案是从响应中提取重定向 URL 并手动重定向到它。