如何构建单点登录应用程序(电子邮件和通行证)?

How to build a single sign-on application (email and pass)?

我想建立一个单一的登录界面(Angular),它应该是一种独立的,以便可以使用和嵌入from/on任何页面。

例如客户可以将其作为覆盖层嵌入到他的索引页面上,并且 code/functions 应该从 JavaScript API 传递并构建 UI 和连接。

我正在考虑一个类似单点登录应用程序的概念,它允许用户通过他们在 Facebook 上的帐户在其他网站上进行交互。 像 Facebook 连接之类的东西。

达到此目的的最佳方法是什么?首选技术是 Angular2,Angular4

[不完全是答案,但评论太长]

我认为最根本的不匹配是你在问 "how do I do auth" 而我在反驳 "there are lots of ways, with varied costs/benefits. You need to assess them and pick the right approach for your use case. OAuth2 is a sensible starting point, but many others exist."

在那之后,找到一个可以完成这项工作的图书馆(相对)简单。

所以...我认为您需要确定许多事项才能继续。

我最初的问题是:

  • 考虑到暴露的数据,我们需要为最终用户提供什么级别的安全性。
  • 我们的对手是谁?黑客?民族国家?心怀不满的员工怎么办?
  • 我们将如何缓解上述所有问题?
  • 需要什么日志记录和审计,以便在违规后我们可以了解发生了什么。
  • 如果我们使用第 3 方 IAM 服务,它希望传递给它的数据是什么以及它做什么 return。它会自动处理三向身份验证(我们、最终用户、第三方)还是必须围绕它构建一些东西?如果是后者,IAM 提供商是否有包含我们需要的功能的SDK/similar。

概括地说,我建议的架构可以这样的东西:

  • 用户想要在第三方应用程序中进行身份验证
  • 第 3 方将用户重定向到您的 server/api/IAM 用户登录(或回收活动会话)的平台。
  • 您的系统提示用户允许 3PA 访问(部分?)您的数据。
  • 假设用户同意,将用户重定向回 3PA,连同特定于该 3PA的身份验证令牌

然后 3PA 可以使用该令牌代表用户执行操作,直到令牌被取消。

好处:

  • 3PA 永远看不到用户凭据,只有在成功批准后才知道它的令牌。
  • 令牌是针对每项服务的,这意味着您可以撤销对一个站点的许可,而无需撤销所有站点。
  • 用户可以跟踪谁有权访问他们的详细信息。
  • 您可以跟踪哪些系统正在对您进行身份验证(取决于您在初始连接时要求提供多少信息,以及 3PA 是否必须预先注册并获取 ID 才能请求身份验证)。

我所描述的基本上是极简主义的 OAuth 工作流程。您可以自己实施它,但是有很多陷阱,我不相信您完全理解您正在尝试的安全隐患,所以我绝对建议使用已知良好的过程而不是尝试自己动手。

假设 OAuth 适合您的用例....我从来没有从 Angular 开始这样做所以不能推荐一个库但是快速 Google 显示了几十个...结果顶部附近是一个简单的教程:https://devcenter.kinvey.com/angular/tutorials/how-to-implement-safe-signin-via-oauth

还有一个潜在的库:https://github.com/oauthjs/angular-oauth2(虽然乍一看,它似乎不能很好地处理被拦截的凭据场景)