有2个独立的网站,网站A,网站B。网站A想通过iframe嵌套网站B,网站B有登录机制,希望在网站A直接访问网站B,跳过登录步骤,请问网站B改怎么拓展才能支持?
当前网站B的后台是用koa搭建的,在路由处通过判断ctx是否有session数据,如果没有则重定向,有则next();大致实现如此:
app.use(async (ctx, next) => {
/* 目前需求希望能支持被 xxx.com网站嵌套的平台能跳过重定向
let hostOrigin = getHostOrigin(ctx);
if (hostOrigin === 'xxx.com') {
await next();
}
*/
if (!ctx.session.user || !ctx.session.userid) {
ctx.redirect('/#/login');
return;
}
await next();
});
上述代码中的getHostOrigin(ctx)该如何实现呢?
###问题已处理,通过请求头的referer
字段判断。
如果从网站A首次访问网站B,从referer字段是分辨出来自网站A;
切换页面路径时此时referer字段是网站B本身;
如果是从空页面直接访问网站B,referer字段为空;
由此可以推断,如果referer是网站A则或网站B,则跳过重定向,其余情况不做处理。
###网站B实现一个验签机制,可以通过链接方式登录.
形如这种链接: http://b.com?signature=asdfasdfasdfasdf&account=username×tamp=16728281728
;
网站B接收到请求时,检查是否带有这些参数.
如果有,就将其解密获得身份,然后走正常密码登录用户的逻辑,写cookie什么的.
否则重定向到账号密码登录页面.
网站A接入网站B时,使用网站A登录用户的身份信息,按照网站B的加密方式生成链接.
这种方式的好处就是前端无感知.加密解密都在后端,也比较安全.
###iframe和外层窗口之间可以用postMessage通信。不知道这个在你的业务里用不用得到。
###关键是你要自动登录啊,这就是说,两个网站有相同的用户系统。
那么,你可以通过通信,B 的前端去 A 的前端拿一个 Token,再拿到后台去认证(后台认证),认证过了之后给 B 发 Token,实现自动登录。
安全性上可能会有一些问题,需要仔细去验证一下。
###后台读取 Referer 头部判断