0

我正在基于 StackExchange 的 API 在 Android 上制作一个混合应用程序。我需要在其中提供登录功能。我正在按照他们的 JS SDK http://api.stackexchange.com/docs/js-lib中描述的步骤进行操作。我能够成功执行 SE.init,但是 SE.authenticate 给出了一个错误,如“代理 URL 上的意外域”。现在我的应用程序的 url 在其域中有 localhost:8080,这是我在 SE.init 的 channelUrl 属性中指定的。即使我在 android 设备上运行它,它的域就像 file:///data/data... 之类的。那么我该如何解决这个问题?

在整个过程中,当我的浏览器在我的应用程序中单击登录后启动时,我确实看到了 stackexchange 的各种登录选项,例如通过 google、facebook 等登录。但是我上面描述的问题发生在我点击说 google 登录后. 所以它尝试重定向并发现我在 SE.init 的 channelUrl 中指定了一个本地主机域

4

1 回答 1

1

我遇到了类似的问题,所以我将分享我的发现,希望它对您或其他处理相同问题的人有用。

首先,您应用的注册域必须与您在 channelUrl 中提供的域匹配。这里需要注意的重要一点是,以下内容不被视为相同的域:

`example.domain.com` and `example.domain.com:8080`. 

许多浏览器会将其视为跨域帖子,因此您最终可能会收到以下错误:

无法将消息发布到 example.domain.com。收件人的来源为 example.domain.com:8080

这是为了防止跨站点脚本攻击。

什么对我有用?: 我意识到处理localhost东西的特性是一件非常痛苦的事情。因此,我在像 Heroku 这样的云托管服务上注册了我的应用程序(您可以选择任何可用的服务,我选择 Heroku 是因为它为初学者提供了快速且无忧的注册以及一个不错的工具带集。)。发布我的域现在是myapp.herokuapp.com。有一次,我在 StackExchange 应用程序的 OAuth 域中指定它并修改channelUrl参数以包含myapp.heroku.com/blank.html,这一切都开始工作了,我现在可以使用 StackExchange API 获取数据。

我正在发布我与 StackExchange 支持人员讨论的链接,这些支持人员帮助我找到了这个解决方案。

希望这可以为您指明解决方案。

于 2013-08-17T06:09:55.850 回答