youtube如何登录到Gmail帐户而不重定向?

时间:2016-06-01 05:04:13

标签: login single-sign-on google-login

第1步:我登录了我的Gmail帐户。浏览器实际上重定向到accounts.google.com。所以我登录并重定向回登录到

的gmail

第2步:现在在浏览器中输入youtube.com。没有任何重定向,我使用gmail帐户登录到youtube。

Youtube是一个完全不同的域名。如何在没有任何重定向的情况下与accounts.google.com进行通信?我通过Chrome开发者工具检查了网络请求,但看不到这样的重定向!

1 个答案:

答案 0 :(得分:11)

这是一种技术解决方案,允许使用中央sso域(accounts.google.com)在youtube或gmail等两个或更多网站之间进行跨域通信

1)登录gmail重定向到accounts.google.com,识别您并使用您的帐户信息发出身份验证令牌(JWT格式)。令牌存储在浏览器localStorage

//Store the Json Web token with accountInfo in localStorage
localStorage.setItem('tokenId',jwt);

2)Youtube会检查accounts.google.com localStorage以查找身份验证令牌。如果找到,则允许您输入。

可以使用中间域accounts.google.com在域之间共享Cookie和localStorage。在主页上嵌入了iframe,它访问cookie并将消息发送到主。

//Create iframe when page is loaded pointing to sso domain. For example in gmail.com and youtube.com pointing to accounts.google.com
var iframe = document.createElement('iframe');
iframe.style.display = "none";
iframe.src = 'https://sso.domain.com/sso.html?sourceDomain=...;
iframe.id = 'sso.iframe';
document.body.appendChild(iframe);

加载iframe时,将带有jwt的消息发送到父页面

window.parent.postMessage(jwt, sourceDomain);

父页面接收令牌

//Message listener for SSO events (created by the sso.iframe)
addEventListener("message", _listener, false);

function _listener(event){
    //origin check
    if (  sourceDomain.lastIndexOf(event.origin ) == -1){
        return;
    }

    var jwt = event.data
    //do something with the token...
 }

因此domain1.com和domain2.com可以通过这种方式共享cookies / localStorage。打开Chrome-> Inspect->资源 - >本地存储,您将在accounts.google.com中看到共享信息(有许多数据字段)。

JWT是自包含的,并使用服务器密钥签名。它包含用户数据,并且可以验证发行者的完整性和身份

查看https://github.com/Aralink/ssojwt以这种方式查看SSO的实施,并解决不同浏览器的所有问题

这是谷歌使用的一般架构。如果您浏览gmail或youtube代码,您将看到许多内容和其他附加字段。谷歌还添加了原产地限制。如果您想使用accounts.google.com SSO,则需要在Google应用中注册,获取集成ID并指定您的授权来源