我们提供多种在线服务.如果用户从一个服务(on domain1.com)转移到另一个服务(on domain2.com),我们需要开发一个为用户提供快速/简单体验的系统.
一旦他转移到新服务后,是否有一种安全可靠的方式自动登录用户?
如果下面的解决方案完全不安全/错误,请对我大喊大叫.
我们正在考虑一个类似于许多在线服务提供的用于密码恢复的系统 - 它们通过电子邮件发送一个带有唯一哈希的链接,该链接过期,允许他们更改密码.
该domain1.com会生成一个唯一的哈希值,并将其存储在连接到用户以及一个到期时间字段的哈希数据库.
用户将被转移到 domain2.com/auto/?hash=d41d8cd98f00b204e9800998ecf8427e
domain2.com接下来将domain1.com使用散列请求获取有关用户的信息.domain1.com然后将从数据库中删除哈希.domain2.com会记录用户并设置cookie等
可以基于OpenID或OAuth获得相同的结果吗?
我在不同领域的几个网站:example.com,example.org,mail.example.com
和passport.example.org.所有网站都具有共同的外观,应该共享相同的用户群.
在这种极端情况下,我仍然希望所有站点透明地(尽可能地)共享具有以下关键属性的用户会话:
单点登录.当用户passport.example.org登录并访问任何其他站点时 - 他应该被视为已登录.
登录用户$username在站点标题和不同的导航菜单中获得"Hello ",问候语,列出他们有权访问的服务.如果他没有登录,而不是打招呼有一个"登录"链接,指向passport.example.org/signon.
可信域列表是已知的,因此使用OpenID或某些homebrewn轻量级协议实现起来相当简单.当用户第一次访问该站点时,我将其重定向到特殊身份验证端点passport.example.org,然后以静默方式将其重定向回来,其中包含身份信息(或"未签名"匿名身份).对于大多数浏览器,这是完全透明的 显然,我正在使用nonce值来对抗重定向循环.
单一签收.当用户下次访问任何网站时点击任何网站标题中的"注销"时,他应被视为"未登录".
OpenID不是为此而设计的.我当前的想法(我已经有一个部分工作的实现)是在DB中发送不是用户身份,而是"全局"会话令牌和共享全局会话表(global_session_token↔用户关系).
机器人和无cookie用户支持.站点具有公共区域,用户代理可以访问这些区域而无需任何cookie支持.
因此,我在(1)中提到的重定向成为一个问题,因为对于每个单页请求,我最终都会将用户代理抛给auth端点并返回.这不仅会使机器人感到困惑,而且会很快污染我的会话数据库.我绝对不想显示"嘿,你没有启用cookie,走开!"页面,这是非常粗鲁和令人失望的.虽然我需要cookie支持登录,但我希望用户可以自由阅读网站的内容等等 - 没有任何限制.
而且我明确地不希望把URL中的会话ID,除了我刚才提到了一些透明的跨域重定向.我认为这样做是一个安全问题,通常只是一件坏事.
在这里,我几乎没有想法.
好吧,我知道这很难,但谷歌实际上(这是否在某种程度上google.com,
google.很多-的-通用顶级域名,gmail.com等等),对不对?所以这应该是可能的.
我要感谢协议描述的想法(这是最好的)或系统的链接(要么是代码阅读,要么是直播现场观看和学习)已经成功地实现了这样的事情.
总结一下:几个域没有共同的根,共享用户群,单点登录,单点注销,匿名浏览不需要cookie.
所有站点都在同一个网络上(但在不同的服务器上)并且部分共享同一个PostgreSQL数据库(在同一个数据库的不同方案中).大多数站点都是用Python/Django编写的,但其中一些是使用PHP和Ruby on Rails.虽然我正在考虑与框架和语言无关的东西,但我很感激指向任何实现.即使我不能使用它们,如果我能理解它是如何完成的,那么也许我能够实现类似的东西.