我们有一个遗留系统,我们想把它带到Angular。由于系统很大,我们将逐步进行模块化。
现在,直到我们完成整个系统,我们可能需要在Angular SPA和遗留系统之间切换,因为在我阅读时Angular并没有真正在应用程序内部播放。
现在你怎么做auth? 在SPA方面将是JWT和相应的端点,将其转换为经过身份验证的用户。在传统方面,会话存在。
但是如何处理切换上下文(在SPA和Legacy之间)以同时使用JWT and session cookie
?我的猜测是存储JWT令牌和cookie,并将两个系统保存在Legacy公共文件夹中,通过Angular进行身份验证,发送和存储这两种类型。
有没有更好的方法来实现这一目标?
答案 0 :(得分:0)
很抱歉我无法尽早回复。我可以想到的一种方法是在每个Angular SPA和遗留系统中嵌入一个iframe,从另一个系统加载接收页面。此接收页面的作用是将用户登录到另一个系统中。此外,您不希望将JWT或任何敏感内容存储在公用文件夹中;使用localStorage for JWT,它应该足以使会话保持在客户端级别。
有关实施iframe的信息,请参阅https://jcubic.wordpress.com/2014/06/20/cross-domain-localstorage/
让我们看看以下场景。根据您实施身份验证的方式,可能需要进行一些修改才能应用:
当用户登录Angular SPA时,通过旧版API进行的身份验证将返回JWT并存储在localStorage中。每次用户通过Angular应用程序发出请求时,JWT都会通过您的Authorization标头发送,以便识别用户。
现在,登录后返回JWT时,向嵌入式iframe发送登录消息(指向旧版接收页面),以便接收页面在您的旧域上创建用户会话/ cookie。您应该将cookie设置为与JWT具有相同的到期时间。
从localStorage中删除JWT。向您的iframe发送消息,以便在您的旧域中销毁用户的会话cookie。
您需要稍微修改登录信息。当用户登录到旧系统时,您还需要生成JWT并在登录成功后将其返回到页面。通过嵌入式iframe(现在指向您的Angular应用程序)发送消息,将您的JWT保存在SPA域中的localStorage中。
您不必在Angular端创建用户会话,因为JWT已足够,但请记住,用户会话到期时间应与您的JWT到期同步。
通过ifame向Angular SPA发送消息,从localStorage中删除JWT。同样,您不必担心Angular端用户的会话,因为您已经在使用JWT进行授权。
显然,要实现此iframe方法,如果您的网站位于不同的域,则需要启用CORS。确保您实施适当的安全措施,以防止利用XSS或嵌入iframe等漏洞将您的网站加载到不允许的域中。
此外,当我使用JWT时,我会生成一个id(JTI)并使其成为JWT有效负载的一部分,并将散列的JTI存储为cookie。这样,每当用户使用JWT发出请求时,我都可以检查浏览器是否有JTI cookie,并确保用户不只是窃取JWT以在另一台机器上使用。
如果您还有其他问题,请与我们联系!