Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 跨域OAuth。。。如何得到回应?_Javascript_Google Chrome Extension_Oauth - Fatal编程技术网

Javascript 跨域OAuth。。。如何得到回应?

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,并询问用户:“您想

我正在创建一个Chrome扩展,它将与一个特别流行的网站进行交互

它将html注入站点,从而添加新功能。这些特性的一部分取决于登录的用户,为了获得登录的用户信息,我们需要使用该网站的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有类似的东西吗?我希望构建它,这样它就不知道扩展的类型了。哇,这是一个非常好的答案,我不会想到这样做哇,这是一个疯狂的答案,通过
*
广播。这非常有帮助。谢谢!我同意,爸爸,这是有史以来最好的一次!