SPA 认证

信息安全 验证 oauth
2021-08-25 22:16:15

我正在为我的公司开发一个具有以下参数和组件的应用程序:

  • 第一方前端单页应用程序 (SPA)。 这是在 TypeScript(JavaScript 的一种方言)中实现的,我们正在内部开发代码。
  • 第一方后端 REST API,它可以访问位于其他地方的 MongoDB。这是用 JavaScript 实现的,并使用在 Node.js 上运行的 Express。我们正在内部开发代码。现在这部分所做的就是通过 REST API 提供 CRUD 操作。
  • 这些应用程序只能提供给我们的员工所有员工都拥有已加入我们公司的 Azure AD 的 Windows 10 笔记本电脑。
  • 我们没有本地 ADFS 服务器。 我们是 100% 的云。
  • 该应用程序将在其业务逻辑中使用 Azure 资源,例如 Graph API。
  • 该应用程序还将使用其他 3rd 方资源,例如我们公司的 Dropbox。
  • 对“应用程序”进行身份验证还应尽可能无缝地针对所有其他第 3 方应用程序(如 Dropbox)进行身份验证。
  • 今天我们有 10 名员工。在接下来的几年里,我们极不可能有超过 50 名员工,届时这个应用程序将升级到第 2 版,我将聘请某人来构建它。

是时候为我们的应用程序实现身份验证和授权了。应用程序应同时针对 Azure AD 进行身份验证和授权。理想情况是登录到公司笔记本电脑的用户应该在应用程序上自动进行身份验证,而另一台机器上的用户(例如机场或酒店信息亭)将使用他们的 Azure AD 凭据登录。

我的问题是在这种情况下应该使用哪个 OAuth2 授权流。

我已经阅读了一些来自 Microsoft 和 OAuth 的文章,经历了许多 Udemy 课程等,并从这些来源获得了相互矛盾的建议。一些人建议 SPA 应该使用隐式授权,而另一些人则说,如果后端服务器上有业务逻辑(并且存在/将要),则应该使用客户端凭据授权。

我是一位经验丰富的开发人员,但我不是安全专家。在我的完美世界中,我会将这个应用程序的身份验证部分的设计和实现外包给安全专家,但预算是这里的主要限制。在这个阶段花数千美元让别人为我们建造这个根本不可行。

综上所述,鉴于上述设计和架构,应该如何实施身份验证?应该使用哪个授权流程?

1个回答

TL;DR Go with implicit... 检查我应该使用哪个 OAuth 2.0 流程?用于决策过程的可视化。


说到身份验证,魔鬼在细节上……我会尽量不要忘记任何事情。

基本 OAuth2 规范引入了四种授权类型:

  • 隐式授权
  • 授权码授予
  • 客户端凭据授予
  • 资源所有者密码凭证 (ROPC) 授权

如果您排除了 ROPC,其中包含为用于存储用户名和密码以便能够代表用户执行操作的应用程序提供无缝迁移路径,您将获得三个可能的授权。

在这三个中,您明确区分了客户端凭据 (CC) 授予和其他两个。CC 授权针对希望代表自己访问资源的客户端应用程序,即以客户端应用程序本身的身份访问资源。

这意味着为了使用此授权,客户端应用程序必须能够执行客户端身份验证,以证明请求来自合法应用程序。

SPA 无法执行客户端身份验证,因为任何想要查看源代码的人都可以看到您存储在应用程序中作为身份验证手段的任何秘密密钥。然后,CC 授权主要限于更容易保密的服务器端应用程序。

另一个要点是,如果您希望您的客户端应用程序访问最终用户拥有的资源和/或代表他们执行操作,则 CC 授权不适用。

似乎选择池现在是我们开始时的一半,其余的候选者是隐式或授权代码授予。通常,如果您有 SPA,则执行需要身份验证/授权的请求的代码位于浏览器端,因此显而易见的选择是隐式授权,因为它将令牌作为授权端点响应的一部分提供,并且不需要额外的对令牌端点的请求,它在浏览器领域可能表示可能可行或不可行的 CORS 请求。

作为附加说明,如果您描述的组件(前端 SPA 和后端 API)被视为生活在同一域下的单个应用程序,并且没有计划将 API 开放给其他应用程序,那么依赖它甚至应该是可行的在传统的基于 HTTP 的基于 cookie 的身份验证上,该身份验证将由根据 OpenID Connect 规则接收的 ID 令牌引导。您提到了 REST,因此只想声明基于 cookie 的身份验证并不一定意味着服务器端托管会话;但是,基于 cookie 的身份验证需要 CSRF 缓解措施。