0

我正在从其官方网站阅读 Angular 的博客(https://blog.angular-university.io/angular-jwt-authentication/ ),其中使用单独的服务器进行身份验证,而应用程序使用不同的服务器。因此,在这种情况下,cookie 将由身份验证服务器发出,但将在应用程序服务器中使用。这怎么可能?我无法从该博客中理解以下解释:

Cookie 和第三方身份验证提供程序

在 cookie 中接收会话 JWT 的一个潜在问题是我们无法从处理身份验证逻辑的第三方 Web 域接收它。

这是因为在其上运行的应用程序app.example.com无法访问来自另一个域(如security-provider.com.

因此,在这种情况下,我们将无法访问包含 JWT 的 cookie,并将其发送到我们的服务器进行验证,从而无法使用 cookie。

我们能否充分利用这两种解决方案?

第三方身份验证提供商可能允许我们在我们网站的可配置子域中运行外部托管的登录页面,例如login.example.com.

因此,将所有这些解决方案的最佳组合在一起是可能的。这是解决方案的样子:

  • 在我们自己的子域 login.example.com 上运行的外部托管登录页面,以及在 example.com 上运行的应用程序
  • 该页面设置了一个仅包含 JWT 的 HTTP Only 和 Secure Cookie,为我们提供了很好的保护,可以抵御多种依赖于窃取用户身份的 XSS 攻击
  • 另外,我们需要添加一些 XSRF 防御,但对此有很好理解的解决方案。

有人请解释以下行:

第三方身份验证提供商可能允许我们在我们网站的可配置子域中运行外部托管的登录页面,例如 login.example.com。

这是什么意思,我们如何在认证服务器上实现这一点,我们如何在应用服务器中访问认证服务器发出的cookie。请澄清这是否意味着在身份验证服务器发出的cookie中将域字段设置为应用程序服务器,或者是其他东西。

Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

此外,如果是这种情况,应用程序服务器如何验证身份验证服务器提供的 cookie。身份验证服务器是否也将此 cookie 发送到应用程序服务器?我们是否也必须建立这种机制?

4

4 回答 4

1

你的问题对我来说有点模糊,有很多不同的问题。

这是因为在 app.example.com 上运行的应用程序无法访问来自其他域(如 security-provider.com)的 cookie。

Cookie 仅发送到它们来自的域。因此,两个不同域上的两个应用程序无法访问彼此的 cookie。

第三方身份验证提供商可能允许我们在我们网站的可配置子域中运行外部托管的登录页面,例如 login.example.com。

解决这个问题的方法是使用子域将两个应用程序放在同一个域上。app.com 和 login.com 无法访问彼此的 cookie。app.example.com 和 login.example.com 可以,因为它们都在域 example.com 上

例如,oauth 还使用了其他解决方案。我将简要介绍它的工作原理,但我建议您自己查看细节。

假设我们有 app.com 和 login.com。

  1. 用户访问 app.com 并且未登录。用户单击登录按钮。
  2. 用户被重定向到 login.com?application=app.com
  3. 用户使用其凭据登录
  4. login.com 通过 URL 中的会话将用户重定向回 app.com:app.com?session=123
  5. app.com 可以使用 sessionid 从 login.com 获取有关用户的信息
于 2021-06-03T09:56:58.543 回答
0

正如 Robin 正确指出的那样,使用子域是一种处理同源/CORS 策略的方法。这可能不适用于所有场景 - 例如,在我的情况下,我们希望使用 AD 公司帐户来验证用户,而不是必须创建其他帐户。加上获得一些额外的好处,比如将用户管理与应用程序分开。对于使用 MS Azure 的 AD 用户,您可以执行此操作,它的工作原理基本上与转发和重定向描述的一样。在我们的例子中,我们将 JWT Bearer Token 放在 HTTP Header 中,并且不使用 cookie。后端通过每个 REST 请求获取 HTTP 标头中的 JWT 令牌,并可以通过使用身份验证提供程序的公钥解密它来验证它。Token 可以携带除 user-id 之外的附加信息,如友好名称,用于在后端授权的电子邮件或用户角色。即使您使用第三方提供者而不是您自己的 OAuth 实例,整个事情也花了我们一些时间来实现,这不是一项简单的任务。

于 2021-06-07T10:41:30.487 回答
0

只是为了添加其他 2 个(正确)答案,cookie 无法在域之间共享有几个原因。它们都归结为同一个问题:内部数据是私有的,如果不强制执行,那么登录的安全性就会大大降低。任何人都可以编写一个简单的脚本,不仅可以访问 jwt 令牌,还可以访问用户数据。另一个原因是因为用户只允许第一个域拥有用户数据数据。

于 2021-06-08T06:38:01.547 回答
0

有3个核心概念:

  1. app.example.com无法读取security-provider.com域的 cookie。安全限制。
  2. 您无法HttpOnly通过 js 读取 cookie。
  3. 由于#1 和#2,您需要在同一域上实现代理应用程序。

简而言之,他们告诉您的是在您的设备上创建一个新的仅登录页面sub.mydomain并与主应用程序进行通信,mydomain因为设置 cookie可以在plus XSRFsub.mydomain上访问,反之亦然。domain=mydomainmydomain

一篇关于我们在 2015 年如何处理跨域通信的短文 可能会很有趣

于 2021-06-08T09:11:41.640 回答