node.js - 使用我的自己的Web应用程序使用passwordjs管理单点登录-共享登录

标签 node.js authentication oauth-2.0 passport.js

如果我有5个不同的Web应用程序,所有这些Web应用程序都托管在不同服务器上的各自域中,是否可以使用passport.js创建单一登录,从而将用户重定向到所有Web属性的登录位置?

我是否需要为此创建自己的自定义策略,或者有一种通用的可用于这种场景的策略?

最佳答案

无论您是只关心登录还是担心如何确保对Web,API和移动应用程序的身份验证和授权,您都需要:OAUTH2

Oauth2提供者或平台

为此,在最简单的情况下,您需要一个具有以下端点或功能的oauth2提供程序或平台:

  • https://secure.com/signin/oauth
  • 返回集中登录的URL。响应几乎总是带有 302 重定向代码。
  • 示例:当您输入某个Google应用程序时,您将重定向到到统一和集中化的Google登录页面
  • https://secure.com/oauth/token
  • token 生成。如果要满足oauth2规范,请使用access_token。
  • https://secure.com/oauth/introspect-token
  • token 验证。您可以验证 token 的某些方面,例如:验证,到期时间等
  • https://secure.com/user/profile

    如果收到有效的 token ,
  • 通常会返回基本用户信息(电子邮件)。
  • 用户管理
  • 用户创建(名称,标识符,电子邮件,密码等)

  • Passport.js

    Passport.js依赖于oauth2提供程序,该提供程序必须提供规范端点,例如google,facebook,auth0等。请查看完整列表:http://www.passportjs.org/packages/

    因此,Passport.js可以帮助您使用选择的oauth2提供程序来管理Web身份验证流程。

    Oauth2 Web流

    最基本的oauth2流可以是:
  • 用户从其浏览器
  • 输入web.com
    部署在诸如nodejs + express之类的某些Web服务器(不像apache或nginx这样的基本服务器)中的
  • web.com会检测到该新用户并仅为他打开一个 session
  • 此nodejs + express中的某些逻辑检测到用户尚未启动有效的 session 。通常这是存储在 session 中的标志。另外,如果没有有效的 session ,则表明用户尚未启动有效的 session
  • 如果用户没有有效的登录名,那么您的nodejs逻辑会向oauth2平台询问登录URL ,并得到如下内容:https://secure.com/signin/oauth并使用302代码
  • 返回此URL。
  • 用户浏览器(firefox,opera,chrome等)将web.com响应作为带有302代码的URL进行获取,并重定向到该URL。
  • 用户输入有效的凭据,并将其重定向到原始应用程序:web.com。此重定向众所周知:oauth2 回调或oauth2重定向
  • 省略了access_token(https://secure.com/oauth/token)和经典用户电子邮件获取(https://secure.com/user/profile)的授权码交换(在回调步骤中接收),您可以说:我的用户已登录!

  • 安全休息Apis

    就像我说的那样,使用sso登录只是冰山一角。用户登录后,您将准备好使用有效的 token (通常为jwt)以使用您的企业rest api。此时出现此问题:
  • 具有邮件jon@web.com的简单用户可以使用api https://humanresources.com并删除您组织的员工吗?

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

    无论您使用的是API网关还是任何API内部的直接逻辑,在最简单的情况下,都必须在OAUTH2 PLATFORM中使用以下功能:
  • 注册您的所有应用程序:Web,api,移动等
  • 为您的应用程序注册选项
  • 对于Web应用程序,选项可以是菜单选项,例如:/home,/form1,/admin等
  • 对于rest api,选项是端点及其http方法。 jane有权执行对https://humanresources.com/employee的POST(创建)调用,但是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 |
    
    
  • 使用API​​ GATEWAY的用户,个人资料,角色,应用和选项之间的先前关系,或者api内部的逻辑,您可以验证某些用户是否具有对api中的端点执行调用的必需访问权。

  • Ouaht2 Api流量

    网络流程为我们提供了有效的 token 。因此,如果您的网站需要使用一些API,请执行以下操作:
  • 用户 jane@web.com 已登录。
  • Web,使用ajax通过POST方法
  • 对某些端点(如https://humanresources.com/employee)执行http调用
  • Web必须将收到的 token 作为http header 发送到api端点。
  • 不管您是否有API GATEWAY或api(库)内部有逻辑,这都是确定 jane@web.com 是否有权访问https://humanresources.com/employee POST的流程
  • 从 header
  • 中提取 token
  • 使用https://secure.com/oauth/introspect-token发送提取的 token ,调用的终结点(/employee),http方法(POST)
  • 使用先前先前在用户,个人资料,角色,应用和选项之间创建的关系,我们的 OAUTH2 PLATFORM 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,则filter必须传播调用直到api的后端 Controller 为止,以便执行预期的逻辑。如果响应为假,则停止执行(未触摸 Controller )并返回403错误。

  • Oauth2提供程序或平台

    以下是一些选项及其说明:
  • 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 token ,使第三方能够以用户的名义访问您的API。

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

    开源
  • Glewlwyd
  • Keycloak
  • OAuth.io
  • ORY Hydra
  • SimpleLogin
  • SSQ signon
  • https://github.com/jrichardsz/oauth2-shield
  • 这是我创建oauth2平台的尝试。目前,只有非交互式用户可以生成 token 。我希望有更多的时间来添加解释的功能。

  • 商业
  • Auth0
  • Curity Identity Server
  • FusionAuth
  • Okta
  • Red Hat Single Sign-On
  • cidaas


  • It is very important to test if the selected oauth2 provider meets all of your current and future requirements.

    关于node.js - 使用我的自己的Web应用程序使用passwordjs管理单点登录-共享登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61940910/

    相关文章:

    mysql - Express JS 使用 Mysql 获取正确的 JSON

    node.js - 获取一个集合并为响应添加一个值

    javascript - 将 React 路由组件传递给父组件 props 函数

    java - 为什么使用 cookie 而不是记录每笔交易

    PHP - 用户登录后,重定向到存储在数据库中的地址

    spring - 如何绕过 Grails 异常处理以使用 Spring Oauth2?

    javascript - 如何对快速路由器路由进行单元测试

    c# - ASP.NET MVC登录客户端/ASP.NET WebAPI认证/授权服务器分离

    asp.net - ADFS 4.0 : Received invalid Client credentials

    ruby-on-rails - 尝试使用 Google Calendar API 时出现 "Missing authorization code"错误