链接 OpenID 令牌

Chaining OpenID tokens

我在微服务环境中工作,其中每个服务使用 OpenID Connect 验证服务(本地 IdP),基于我在本地数据库中保留的用户。

现在,我希望这些服务能够使用 AzureGoogle 等进行身份验证

我可以(并且应该)修改我的身份验证服务以允许重定向到另一个 IdP,并将令牌替换或链接到我的专有令牌以供我的服务使用吗? 有没有更简单的方法?

如何允许用户使用名称/密码或外部 IdP 登录?

如果您管理所有 SP(您的微服务),那么在您的通用 IDP 上实现它肯定更容易。

但是如果 SP 是外部的(比如您刚刚安装的现有服务)并且他们已经实现了您想要使用的 public IDP,那么要顺利通过您当前的 IDP 会有点困难.


我猜你是第一种情况(你做了所有的SP)所以我会详细说明:

当您当前的 IDP 将对其他人的用户进行身份验证时 public IDP,它将获得一些信息(电子邮件、姓名等),您可以在您的答案中规范化这些信息,以确保您的 SP 完全正确不知道使用了哪个原始 IDP。如果将来调试此设置对您来说会更好。当然要添加一个新的 public IDP...

但是如果您需要对原始 IDP 使用一些特定的调用,(例如 Youtube API)您可以在您的普通 IDP 上有一个不可知论者 API,它将转发给适当的原 IDP 的专有 API,如果 IDP 没有视频系统,则拒绝请求。

或者您可以在您的 oidc 令牌的自定义字段或范围内将原始令牌提供给您的 SP,例如,专用于视频的 SP 可以使用 google 直接调用 Youtube API用户令牌。

我自己也在做一些关于这个主题的研究,从我到目前为止的发现来看,似乎有一个 urn:ietf:params:oauth:grant-type:token-exchange 授权类型应该允许将外部 idp 令牌交换为内部令牌,如 some spec.

中所述

它应该作为 openid connect /token 端点的一部分得到支持,所以只要本地 idp 支持它,我想这应该是实现您正在寻找的东西的最佳实践。

我目前正在研究 mitreid-connect 作为本地 idp 的 idp 实现,我的一些要求是还允许与第三方进行 SSO,同时能够从外部用户身份发出本地令牌。

会随时更新...

我最近为我的公司做了一个类似的设置。我想分享整体结构以了解我们的解决方案。希望对您有所帮助:

我们的身份验证服务器是具有以下属性的 node express 服务器:

  • 托管静态登录屏幕以允许通过电子邮件 + 密码对本地数据库进行身份验证,并提供与外部 OAuth2 提供商进行身份验证的链接。
  • 本地和外部身份验证请求都转发到 Passport.js Authentication strategies
  • 登录成功后,本地和外部Passport.js策略都会响应回调。根据此响应,通过 express-session 创建一个会话对象并发送一个 cookie。
  • 此时,cookie 可用于交换 JWT,因此可以使用 Bearer Access Tokens 对无状态 API 进行身份验证。