域之间的无缝用户迁移

在2019年初,我们更名并从RealtimeBoard更改为Miro。因此,该站点的域已从realtimeboard.com更改为miro.com。



更改域时,用户将不得不在新域上进行授权,本地应用程序设置将丢失,SSO用户无法在没有其他设置的情况下登录-所有这些都不是用户友好的,密码恢复的频率将增加,并且某些用户不能将立即使用该应用程序。



为了最大程度地减少更改域后的流量损失,有必要将授权用户从旧域迁移到新域:



  • 支持通过旧域使用SSO提供程序登录的用户。
  • 将用户的授权令牌从旧域转移到新域。
  • 通过自定义应用程序设置传递LocalStorage。


数据传输与加密



由于站点不使用可以保存和重用令牌的存储,因此决定使用get-parameters传递令牌。通过get参数将令牌传递给公众是不安全的,必须加以保护以防止其被拦截。我们有两种加密方法:OpenSSL和Mcrypt。Mcrypt长时间未更新,与OpenSSL相比,它加密数据的速度更慢,并且我们不需要服务器上的额外负载。因此,我们使用OpenSSL加密了令牌。



但是,生成的哈希仍然可以被拦截并再次使用。为了防止令牌被重用,我们添加了“ encryption date”参数,因此哈希有效期为10秒-这段时间足以执行所有操作。我们还每12小时添加一个替换加密密钥,该密钥存储在Vault中并在站点之间同步。



生成的哈希作为get参数传递,并使用url_encode进行了额外处理,以便通过URL安全传输,因为字符可能会被转义或破坏地址的结构。



哈希结构:



url_encode(OpenSSL({
  'token': '',
  'date': ' ',
  'additional_values': ['param', 'param']
}))


LocalStorage仅可通过JavaScript使用。为了解决此问题,选择了postMessage和iframe接口,该接口允许安全地发送跨域请求。LocalStorage中的数据已使用JSON.stringify()转换为字符串,并传输到miro.com域,在此它们又被转换回并写入miro.com的LocalStorage域。



包含所有步骤说明的工作方案





该图采用易于查看的形式



用户可以通过两种方式进入服务:通过旧域名realtimeboard.com(例如,通过书签)或通过新miro.com(例如,通过广告)。



如果用户转到旧域:



  1. 打开realtimeboard.com的任何页面后,将对用户令牌,创建日期和其他服务信息进行加密。
  2. miro.com/migration/?data={hash} hash Get . , . .
  3. miro.com , , , , .
  4. migrationToken, .
  5. LocalStorage migrationLocalstorage. , JS-, iFrame relatimeboard.com/localstorage/ postmessage , .


如果用户直接转到新的miro.com域,则将检查该用户是否传递了令牌迁移和LocalStorage。如果用户已经完成了迁移,那么他将保留在miro.com域中。如果不是,则会重定向到realtimeboard.com以获得令牌(为此,我们在cookie中存储了两个标志:migrationToken和migrationLocalstorage)。



该方案对于登录旧域realtimeboard.com的SSO用户也适用。添加了一个路由列表,该路由列表在不将令牌迁移到新域的情况下起作用。它们包括用于SSO的路由,该路由按常规执行,并根据其工作状态重定向到/ app /或/ login /,此后再次连接令牌迁移机制。



输出量



我花了一个月的时间进行研究和准备,又花了一个月的时间进行运行(与此同时,我也参与了其他项目)。借助此解决方案,我们能够将授权用户从旧域迁移到新域,并支持使用SSO通过旧域进行授权的用户。



All Articles