使用 Passportjs 为我自己的 Web 应用程序管理单点登录 - 共享登录

Bla*_*man 3 authentication node.js oauth-2.0 passport.js

如果我有 5 个不同的 Web 应用程序,全部托管在不同服务器上各自的域中,我可以使用 Passport.js 创建单点登录,将用户重定向到登录所有 Web 属性的位置吗?

我是否必须为此创建自己的自定义策略,或者是否有一个可以用于此类场景的通用策略?

JRi*_*dsz 6

无论您是否只关心登录或如何确保您的网站、API 甚至您的移动应用程序的身份验证和授权...您都需要:OAUTH2

Oauth2平台功能

几乎所有最常用和现代的安全提供商都至少具有以下端点或功能:

Passport.js

Passport.js 依赖于 oauth2 提供商,这些提供商提供了规范端点,例如 google、facebook、auth0 等。查看完整列表:http://www.passportjs.org/packages/

因此 Passport.js 将帮助您使用所选的 oauth2 提供商管理 Web 身份验证流程。

Oauth2 网络流程

最基本的 oauth2 流程可能是:

  • 用户从浏览器输入 web.com
  • web.com 部署在某些 Web 服务器(不像 apache 或 nginx 那样基本)中,例如 Nodejs+express 检测到这个新用户并专门为他打开一个会话
  • 这个nodejs+express中的一些逻辑检测到用户尚未启动有效的会话。这通常是存储在会话中的标志。此外,如果没有有效会话,则表明用户尚未启动有效会话
  • 如果用户没有有效的登录,您的nodejs逻辑会向oauth2平台请求登录url并得到类似:https://secure.com/signin/oauth的信息,并返回带有302代码的url
  • 用户浏览器(firefox、opera、chrome 等)获取带有 302 代码的 url 形式的 web.com 响应,并执行到该 url 的重定向。
  • 用户输入有效的凭据并被重定向到源应用程序:web.com。此重定向众所周知:oauth2回调或 oauth2 重定向
  • 省略 access_token ( https://secure.com/oauth/token ) 和经典用户电子邮件获取 ( https://secure.com/user/profile ) 的授权代码交换(在回调步骤中接收),您可以说:我的用户已登录!

安全休息 API

正如我所说,使用 sso 登录只是冰山一角。用户登录后,您将拥有一个可供使用的有效令牌(通常是 jwt),以便使用您的企业 REST API。此时就出现了这个问题:

由于 api 休息通常向互联网开放,因此任何拥有有效令牌的人都可以尝试通过您的 api 执行操作。同样,在隔离网络 (LAN) 中工作的 api 中,这个问题也是有效的。

无论您使用 API 网关还是任何 api 内部的直接逻辑,在最简单的情况下,您都必须在 OAUTH2 平台中需要以下功能:

  • 注册您的所有应用程序:Web、API、移动设备等
  • 为您的应用程序注册选项
    • 对于 Web 应用程序,选项可以是菜单选项,例如:/home、/form1、/admin 等
    • 对于 REST API,选项是端点及其 http 方法。jane 有权对https:// humanresources.com/employee执行 POST(create) 调用,但 jon 只需 GET (阅读全部)
    • 对于移动应用程序,选项与网络应用程序相同:菜单
  • 创建配置文件和/或角色以获得矩阵:
| profile or role         | app                 | option         |
|-------------------------|---------------------|----------------|
| human-resources-admin   | human-resources-api | /employee POST |
| human-resources-support | human-resources-api | /employee GET  |

| user         | profile or role         |
|--------------|-------------------------|
| jane@web.com | human-resources-admin   |
| jon@web.com  | human-resources-support |

Run Code Online (Sandbox Code Playgroud)
  • 利用用户、配置文件、角色、应用程序和选项之间的先前关系,您的 API 网关或 api 内部的逻辑,您可以验证某些用户是否具有对 api 中的端点执行调用所需的访问权限。

Oauth2 Api 流程

网络流为我们提供了一个有效的令牌。因此,如果您的网络需要使用一些 api:

  • 用户jane@web.com已登录。
  • Web,使用 ajax使用 POST 方法对某些端点(如https:// humanresources.com/employee)执行 http 调用
  • Web 必须将收到的令牌作为 http 标头发送到 api 端点。
  • 无论您是否有 API 网关或 api(库)内部的逻辑,这都将是确定jane@web.com是否有权访问https:// humanresources.com/employee POST 的 流程
    • 从标头中提取令牌
    • 使用https://secure.com/oauth/introspect-token发送提取的令牌、调用端点(/employee)、http 方法 (POST)
    • 我们的OAUTH2 平台的https://secure.com/oauth/introspect-token端点使用之前创建的用户、配置文件、角色、应用程序和选项之间的关系,必须能够检测 jane@web.com 是否有权执行通过https:// humanresources.com api进行 POST 操作。
    • 在使用 API GATEWAY 的情况下,如果响应为 true 或某个标志表明允许用户执行 http 调用,则网关必须调用远程 api。如果 oauth2 平台返回 false,则不会调用远程 api,并向 ajax 调用返回 403(禁止)响应。Web 必须能够向用户显示警告或错误消息
    • 如果不使用API GATEWAY ,而是使用 api 内部的内部逻辑(通常是 http 过滤器),如果 oauth2 平台返回 true,过滤器必须将调用传播到 api 的后端控制器,以便执行预期的操作逻辑。如果响应为 false,则停止执行(未触及控制器)并返回 403 错误。

我是

现代安全平台提供了很多功能,其中之一是 oauth2 协议(规范端点)。这些平台称为身份和访问管理(IAM)。让我们检查一下他们的一些描述:

  • https://auth0.com
    • 身份是复杂的。处理它。快速集成 Web、移动和旧应用程序的身份验证和授权,以便您可以专注于核心业务。
  • https://www.keycloak.org/
    • 现代应用程序和服务的开源身份和访问管理
  • https://www.ory.sh/Hydra/docs/index
    • Hydra 是 OAuth 2.0 和 OpenID Connect 提供商。换句话说,OAuth 2.0 授权框架以及 OpenID Connect Core 1.0 框架的实现。因此,它会颁发 OAuth 2.0 访问、刷新和 ID 令牌,使第三方能够以您的用户名义访问您的 API。

这里有更多选项: https: //oauth.net/code/

开源

商业的


测试所选的 oauth2 提供商是否满足您当前和未来的所有要求非常重要。