OIDC js 库响应 cookie 不存储,不附加后续请求

OIDC js library reponse cookies are not stored and not attaching for subsequent requests

我正在将 authcodeflow 与 PKCE 结合使用。

在前端使用 OIDC js 库,调用 adfs 获取授权码,然后调用我的后端 api。调用 adfs 服务器的后端 api 获取访问令牌,后端 api returns 将令牌作为前端的 cookie。我可以在响应中看到 cookie headers。但该 cookie 未存储在浏览器中,也未为后续请求添加。我已经尝试在所有模式下使用 samesite -> Lax、None、Strict 且未设置。 这是 OIDC js 库的问题还是阻止 cookie 存储在浏览器中?

更新: 以下是我的分析观察 由于 OIdc-client-js 没有为请求将标志“withCredentials”设置为 true 的选项。请求中没有发送 cookie,跨源的响应 cookie 被忽略 requests.This 更改被标记为增强,但在他们的 github 回购中仍未完成。 https://github.com/IdentityModel/oidc-client-js/issues/1062

有什么方法可以用这个库实现吗?或 OIDC js

的任何其他库

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials

所以您从 API 域发布 cookie,该域是 WEB 域的兄弟域:

  • web.mycompany.com
  • api.mycompany.com
  • Cookie 域 = .mycompany.com

Cookie 被删除的可能原因

可能是 withCredentials 标志或可能是由于缺少用户手势,因为用户没有做任何明确的导航到 api.mycompany.com,例如浏览器导航或单击 link?

强制凭据

您可以像这样覆盖原型以添加 withCredentials 属性。这有点老套,但您可以根据 URL 限制使用,它应该让您知道设置 withCredentials 是否可以解决您的问题:

let open = XMLHttpRequest.prototype.open;  
XMLHttpRequest.prototype.open = function(method, url) {  
    open.apply(this, arguments);
    this.withCredentials = true;
}  

通过 Web 域进行代理将减少 Cookie 问题

在我的 blog post 中,我做了一些类似于包含刷新令牌的代理消息的事情。不过,我使用网络的确切域,而不是使用 API 子域。这永远不会受到浏览器限制的影响。