带有 Laravel Passport 的 SSO
Posted
技术标签:
【中文标题】带有 Laravel Passport 的 SSO【英文标题】:SSO with Laravel Passport 【发布时间】:2017-07-25 08:12:29 【问题描述】:我正在考虑在 Laravel 5 中使用 Passport 开发一个成熟的身份系统。
以下是我的要求:
-
我应该有像 identity.mysite.com 这样的主要身份管理应用程序,我的所有用户都存储在其中。
我还有 2 个其他应用程序 APP1、APP2。
当用户在 APP1 上请求受限资源时,他应该通过 identity.mysite.com 进行身份验证
通过身份验证后,让用户访问 APP1 上的资源
同时,如果用户决定访问 APP2 上的受限资源,则不应要求他再次输入凭据。
我尝试过的事情:
-
simpleSAMLphp - SAML 是为我做这些事情的一个选项。但它还没有OneLogin 成熟,除非必要,否则我不打算在现阶段进入 SaaS 模式。
Laravel Passport - oAuth 2.0 似乎很诱人。我什至可以使用Passport Grant Tokens,但我不确定它在 SAML 上的可靠性。此外,Laravel Passport 被广泛用于验证 API。在验证传统的基于会话的应用程序时它会有用吗?我还没有看到任何使用多个应用程序和 laravel 护照实现正确 SSO 的示例。
我知道 OAuth 2.0 不是身份验证协议。相反,它使用了一种称为授权的东西,但我们可能可以让它支持身份验证协议,如 here 所述。 Laravel 护照支持的东西吗?
【问题讨论】:
你有没有成功,如果有,请在这里发布。 【参考方案1】:您可以使用护照来实现这一点,但是您对示例的看法是正确的,因为某些步骤并不多或缺少。
您可以在 App1 和 App2 端创建一个新的中间件,与 identity.mysite.com 通信并获取用户数据(令牌、范围等、id),然后它将验证令牌是否有效。
在护照服务器端,您需要一个端点来返回令牌是否有效以及任何其他信息。
为避免向您的护照服务器发出过多请求,我建议创建一个服务来获取访问令牌的 TTL,并将其设置为用户数据在 App1 或 App2 上的缓存时间。
【讨论】:
【参考方案2】:这就是我所说的面向资源的方法,所有客户端(app1、app2...)都想知道天气请求用户是否有权访问资源...
在这里,我们需要将所有身份验证逻辑转移到 oauth,并使我们所有的请求应用程序都依赖于 OAuth。这样,如果用户请求应用程序访问资源,那么如果:
存在令牌,然后应用程序将请求 oauth 服务器验证给定的令牌,如果发现为真,则应用程序将向用户提供访问权限。
如果令牌不存在,那么您可以通过请求凭据来解决它,应用会将用户数据传输到 oAuth 服务器并验证它是否使用令牌响应。
根据我用来实现这种方法的经验,我认为 Laravel Passport 是您的身份验证系统之上的一个抽象层。您可以根据需要对其进行模制。可以进行更多的增强和改进,但这将作为 SSO 之上的基本层。
【讨论】:
以上是关于带有 Laravel Passport 的 SSO的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有自定义用户名列的 Laravel Passport
401 未经授权使用带有 Laravel Passport 的不记名令牌
官方 Laravel Passport 包中 Vue.js 组件中的 jQuery 代码