用于跨域身份验证的 JWT 令牌

Posted

技术标签:

【中文标题】用于跨域身份验证的 JWT 令牌【英文标题】:JWT token for cross domain authentication 【发布时间】:2017-07-02 23:48:20 【问题描述】:

我正在尝试在 php 中为两个主题相连的域创建一个简单的 SSO 系统。

所以我想知道是否可以将包含用户用户名的签名 JWT 令牌从域 A 存储到本地存储。然后使用来自域 B 的相同密钥验证 JWT,这将导致身份验证成功。

我在谷歌上搜索了一些答案,我发现其中一些包含一个中间身份验证域,该域将负责身份验证。但我只想链接我拥有的两个域。

谢谢。

【问题讨论】:

【参考方案1】:

你没有理由不能这样做。 JWT 并没有什么特别之处,它只是一个类似于会话 ID 令牌的令牌。 JWT 与任何其他令牌之间的区别在于它可以包含数据的有效负载。

您所描述的本质上是 OAuth 2.0 的密码授权。您的 SSO 系统是授权服务器,它可以对用户进行身份验证并向他们提供访问令牌。在这种情况下,访问令牌实际上也可以是 JWT。然后,用户(资源提供者)可以使用他们的访问令牌访问资源服务器(您的其他相关域),这些资源服务器可以验证访问令牌是否有效并允许或拒绝请求。

在 PHP 中实现 OAuth 2.0 时,我使用以下库:https://oauth2.thephpleague.com/ - 文档中也有一些很好的信息。

【讨论】:

【参考方案2】:

same-origin policy不允许域B到域A的跨域数据存储访问

对存储在浏览器中的数据(例如 localStorage 和 IndexedDB)的访问按来源分开。 每个源都有自己独立的存储,一个源中的 javascript 无法读取或写入属于另一个源的存储。

通常的解决方案是拥有一个用于身份验证的中心域(可以是 A 或 B),并在发送 JWT 的域之间使用重定向或跨域使用身份验证令牌 使用 iframe。查看详情here

OpenId、OAuth 和 SAML 协议适用于重定向,例如 Google 网络套件通过 iframe 连接其应用程序(另外,google 是一个 openid-connect 提供程序)

【讨论】:

以上是关于用于跨域身份验证的 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

JSON Web令牌(JWT)

使用 JWT 不仅仅是身份验证

用于授权和身份验证的多个 JWT 承载

我是不是正确理解用于身份验证的访问和刷新令牌技术?

JWT 身份验证令牌在非 /api 路由中无效

Django Rest Framework 不接受 JWT 身份验证令牌