带有 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 刷新令牌

官方 Laravel Passport 包中 Vue.js 组件中的 jQuery 代码

具有正常设计的 Passport Laravel Rest API Auth

laravel passport是否在承载令牌中序列化整个用户对象?