Javascript 跨域OAuth。。。如何得到回应?
我正在创建一个Chrome扩展,它将与一个特别流行的网站进行交互 它将html注入站点,从而添加新功能。这些特性的一部分取决于登录的用户,为了获得登录的用户信息,我们需要使用该网站的OAuth认证API对扩展进行认证 例如,让我们假设一个流行的站点(显然我们没有自己的站点)是Javascript 跨域OAuth。。。如何得到回应?,javascript,google-chrome-extension,oauth,Javascript,Google Chrome Extension,Oauth,我正在创建一个Chrome扩展,它将与一个特别流行的网站进行交互 它将html注入站点,从而添加新功能。这些特性的一部分取决于登录的用户,为了获得登录的用户信息,我们需要使用该网站的OAuth认证API对扩展进行认证 例如,让我们假设一个流行的站点(显然我们没有自己的站点)是www.github.com 当用户访问www.github.com时,我们的扩展会在站点上插入一个按钮,上面写着“连接github” 当点击该按钮时,一个弹出窗口打开到Githubs OAuth API,并询问用户:“您想
www.github.com
当用户访问www.github.com时,我们的扩展会在站点上插入一个按钮,上面写着“连接github”
当点击该按钮时,一个弹出窗口打开到Githubs OAuth API,并询问用户:“您想让应用程序XYZ访问您的GitHub帐户吗?”?是/否'
一旦他们点击yes,我们的扩展就得到了验证,现在可以使用GitHub API访问他们的用户名等信息,并将其直接注入GitHub.com网站
所有这些都是我们希望它工作的方式,但问题是我们在当前窗口(www.github.com
)和我们自己服务器的弹出窗口(www.server.com
)之间的通信有很多困难
在弹出窗口中发生的Oauth成功回调返回令牌,我们无法将其传回主页面,因为“协议、域和端口”不匹配
从弹出的oauth成功窗口中捕获该令牌的最佳方式是什么,以便我们可以在位于另一个域的扩展中使用该令牌?可能您无法获得响应,因为Chrome具有“同源策略”。 通常,您可以通过让您的www.server.com将www.github.com放在响应中的访问控制Allow Origin头中来解决这个问题 另请参见此问题的答案以获取示例:
以下内容如何:在身份验证流程的最后阶段,您可以重定向到
server.com
。由于您拥有server.com
,因此可以在末尾插入一个脚本,该脚本通过window.opener.postMessage
例如,在由server.com
呈现的最后一页中:
window.opener.postMessage({"userhash": "abc1234567890"}, '*');
然后在扩展中的窗口上注册一个事件侦听器
window.addEventListener('message', function(e) {
console.log(e.data);
});
这应该在chrome和firefox中都可以使用。你看过chrome.identityAPI吗?我以前使用的一种技术是观察弹出地址的变化(实际上使用了一个新的选项卡而不是弹出模式),并从那里捕获令牌(即url包含“token=”)而不是页面内容,然后关闭窗口。我的一个扩展曾经为GoogleOAuth做过这个,但后来我用chrome.identityFirefox有类似的东西吗?我希望构建它,这样它就不知道扩展的类型了。哇,这是一个非常好的答案,我不会想到这样做哇,这是一个疯狂的答案,通过
*
广播。这非常有帮助。谢谢!我同意,爸爸,这是有史以来最好的一次!