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 的理解,系统应该如下工作:
初始登录流程:
- 用户在 foo.com 上输入详细信息
- foo.com 使用密码授予向 Passport.com/oauth/token 发出请求,并检索访问令牌和刷新令牌。此外,还会生成并返回 SSO 令牌。
- foo.com 将用户重定向到 Passport.com/sso/passthrough ,并传递 SSO 令牌和返回 URL 作为查询参数。
- Passport.com 将令牌保存为 cookie,然后重定向到返回 URL。
- 用户返回 foo.com 并且可以使用该网站
请注意,必须重定向到 Passport.com,否则 Safari 和 Chrome 等浏览器在隐身模式下会将 Passport.com 视为第三方域,并且 Cookie 将被阻止。
单点登录流程:
- 用户访问 bar.com
- bar.com 使用 SSO 授权和重定向 URI bar.com/sso/return 向 Passport.com/oauth/authorize 发出 AJAX 请求
- 在 Passport.com 上,SSO Grant 在 cookie 中查找 SSO 令牌,如果找到令牌,则会生成授权代码并将其作为重定向发送到 bar.com/sso/return。由于 AJAX 请求不处理重定向,因此控制权直接传递至 bar.com。
- bar.com 将授权代码交换为访问令牌并返回成功的 AJAX 响应
- bar.com 收到 AJAX 响应并触发页面刷新,因为用户现已登录
为清楚起见,SSO 令牌、SSO Grant、passport.com/sso/passthrough 和 bar.com/sso/return 路由不属于 Laravel Passport;它们是我们在这里实施的新概念。
这里的问题是:
- 在我看来,这个流程应该可行。我错过了什么吗?
- 这是否会给 Oauth2 流程带来任何漏洞?访问令牌和刷新令牌永远不会向客户端显示,但 SSO 令牌会。如果攻击者窃取了它,我猜他们可能会冒充用户。
- Oauth2 协议和 Laravel Passport 是无状态的。通过添加 cookie,我们就添加了状态。这是一种必要的罪恶还是可以通过不同的方式来实现?
- SSO 令牌是否应该直接保存到 cookie,还是应该有不同类型的令牌或授权代码?
- 对于实施 SSO 授权和 SSO 令牌有什么建议吗?