向 Laravel Passport 添加 SSO 流程

Gra*_*mpa 5 single-sign-on oauth-2.0 laravel laravel-passport

我们正在尝试使用 Laravel Passport 实现 SSO 解决方案。关于这个主题已经有一个问题,但我认为这个问题更多的是关于本质问题。

我们的要求是:

  • 在 Passport.com 上运行的 Laravel Passport 服务
  • 不同域上的一些第一方网站:foo.com、bar.com
  • 用户可以通过直接输入访问详细信息(密码授予)来登录 foo.com 和 bar.com
  • 如果用户登录 foo.com,然后访问 bar.com,他们应该自动登录

根据我对 Oauth2 的理解,系统应该如下工作:

初始登录流程:

  1. 用户在 foo.com 上输入详细信息
  2. foo.com 使用密码授予向 Passport.com/oauth/token 发出请求,并检索访问令牌和刷新令牌。此外,还会生成并返回 SSO 令牌。
  3. foo.com 将用户重定向到 Passport.com/sso/passthrough ,并传递 SSO 令牌和返回 URL 作为查询参数。
  4. Passport.com 将令牌保存为 cookie,然后重定向到返回 URL。
  5. 用户返回 foo.com 并且可以使用该网站

请注意,必须重定向到 Passport.com,否则 Safari 和 Chrome 等浏览器在隐身模式下会将 Passport.com 视为第三方域,并且 Cookie 将被阻止。

单点登录流程:

  1. 用户访问 bar.com
  2. bar.com 使用 SSO 授权和重定向 URI bar.com/sso/return 向 Passport.com/oauth/authorize 发出 AJAX 请求
  3. 在 Passport.com 上,SSO Grant 在 cookie 中查找 SSO 令牌,如果找到令牌,则会生成授权代码并将其作为重定向发送到 bar.com/sso/return。由于 AJAX 请求不处理重定向,因此控制权直接传递至 bar.com。
  4. bar.com 将授权代码交换为访问令牌并返回成功的 AJAX 响应
  5. bar.com 收到 AJAX 响应并触发页面刷新,因为用户现已登录

为清楚起见,SSO 令牌、SSO Grant、passport.com/sso/passthrough 和 bar.com/sso/return 路由不属于 Laravel Passport;它们是我们在这里实施的新概念。

这里的问题是:

  1. 在我看来,这个流程应该可行。我错过了什么吗?
  2. 这是否会给 Oauth2 流程带来任何漏洞?访问令牌和刷新令牌永远不会向客户端显示,但 SSO 令牌会。如果攻击者窃取了它,我猜他们可能会冒充用户。
  3. Oauth2 协议和 Laravel Passport 是无状态的。通过添加 cookie,我们就添加了状态。这是一种必要的罪恶还是可以通过不同的方式来实现?
  4. SSO 令牌是否应该直接保存到 cookie,还是应该有不同类型的令牌或授权代码?
  5. 对于实施 SSO 授权和 SSO 令牌有什么建议吗?