Github API 和 Access-Control-Allow-Origin

13

这可能是一个简单的问题,但我无法理解。

我正在尝试从托管在我的网站上的Web应用程序中访问github API。这是代码要点:

<!DOCTYPE html>
<html>
<head>
  <style>p { color:red; }</style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script>
  $(document).ready(function () {

$.ajax( {url :'https://api.github.com/repos/janesconference/kievIIPlugins/commits', dataType: "json", cache: false, success: function (data, textStatus, jqXHR)
        {
            var lastCommitSha = data[0].sha;
            $("p").text("Last commit SHA: " + lastCommitSha);
        }
    });
});
  </script>

</head>
<body>
  <p>Ajax request not (yet) executed.</p>

</body>
</html>
如果我将浏览器指向我上传到我的Dropbox帐户的这个简单网页,一切都很好。 但是,如果我将浏览器指向我上传到我的网站的这个简单网页,我会得到臭名昭著的Access-Control-Allow-Origin异常。
XMLHttpRequest cannot load https://api.github.com/repos/janesconference/kievIIPlugins/commits?_=1360060011783. Origin http://bitterspring.net is not allowed by Access-Control-Allow-Origin.

那么,问题是:

  • 为什么在 Dropbox 上可以工作?
  • 我明白使用 CORS 可以甚至在网站上工作。这涉及将 Access-Control-Allow-Origin: *.github.com 放在我的 Apache 配置中或类似的东西。但是,正如从 en.wiki 引用的那样,

但这可能不适用于安全是一个问题的情况

  • 是否有一种方法可以在不更改 Apache 配置的情况下执行此操作?可能我不能触摸我的托管站点的 Apache 配置,并且始终存在安全问题。正确的做法是什么?

1
Dropbox对我来说很好用。我尝试注册一个新的应用程序,但是我真的不知道在回调URL字段上要填什么:)你能给我一些关于如何设置这个的指针吗?(你发布的链接没有给我任何提示) - janesconference
1
抱歉,我的错误,看起来我的公司最近开始过滤所有流量到Dropbox。我回家后会查一下 :) - Ivan Zuzak
1
这是我为我的页面设置的内容,该页面使用 GH API:名称:ivanzuzak.info URL:ivanzuzak.info 回调 URL:ivanzuzak.info因此,如果您只是从静态页面调用 API(这是您的情况),则一切都是相同的。实际上,在您的使用情况下,您不需要回调 URL,因为您只是想为域启用 CORS,而不使用 OAuth。 - Ivan Zuzak
1
这个就是解决方案。如果你把评论用答案的形式写出来,我会将其选为采纳的答案。谢谢。 - janesconference
2
很酷,很高兴能够帮到你。下面写了一个简短的答案 :) 干杯。 - Ivan Zuzak
1个回答

12
为了让您的网站(例如 http://example.com)支持CORS,您需要通过创建GitHub OAuth应用程序来启用它,网址在此处:https://github.com/settings/applications 由于您使用的是GitHub应用程序来使CORS工作(而不是用来启用OAuth本身),因此您可以在“创建应用程序表格”中的所有三个字段中输入您网站的URL: 请注意,如果您打算使用OAuth功能,则需要以不同的方式设置回调URL。
完成后,您应该能够从您的网站http://example.com发送AJAX请求到GitHub API。

4
即使是 localhost,我也可以。因为我做不到。 - Dane
2
仅翻译文本内容:_不使用它来启用OAuth本身_。这是什么意思?在我的情况下,我需要从我的网站(客户端js)调用Github API。为此,我希望我的用户使用Github进行身份验证,以便在此过程中我可以获得一些令牌,以供Github API调用使用。我该怎么做?我需要注册Github应用程序吗? - Nawaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接