【问题标题】:Cannot make calls to steam api site from my own site (Security Issue)无法从我自己的站点调用 steam api 站点(安全问题)
【发布时间】:2014-08-25 01:44:44
【问题描述】:

我正在尝试创建一个使用 Steam Web api 的 Web 应用程序,总体而言,我基本上对如何启动此应用程序感到非常困惑。This 问题基本上概述了我的问题,我不知道具体如何创建端点并解决此问题。

目前我的网络服务器有 Apache Tomcat,我正在用 Notepad++ 编写所有的 html/css/javascript 代码。我不想使用 jQuery,因为我不知道是否需要。现在我要做的就是从 Steam 的 api 中获取数据。

例如,使用这个api:

http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&steamid=76561197960435530&relationship=friend

我只想获取用户的好友列表。问题是,正如我在上面链接的问题中一样,我无法从自己的站点调用 Steam api,而且我不知道如何在我的服务器上创建端点并解决此问题。

非常感谢任何帮助。我对所有这些都是新手,肯定会感到困惑。

【问题讨论】:

  • 如果您的应用程序在 html/css/javscript 中,您可以使用 Apache 吗? Apache 中有一个 mod_proxy 模块可能适用于此。否则在 Java 中代理请求的东西
  • 我现在用的是apache,那么mod_proxy模块是什么?很抱歉我是新手。

标签: javascript jquery ajax webserver steam-web-api


【解决方案1】:

您可以使用 mod_proxy 将请求从您的服务器代理到 Steam 站点。首先需要在 Apache 中启用 rewrite 和 mod 代理

a2enmod rewrite
a2enmod proxy
apache2ctl reload

假设您的网站是www.example.com,并且您的服务器上的网络根目录是/var/www。创建一个目录/var/www/steamapi。在此目录中创建一个名为 .htaccess 的文件,其内容如下

RewriteEngine On
RewriteRule ^(.*)$ http://api.steampowered.com/$1 [P]

[P] 告诉 Apache 代理请求。现在不要向 api.steampower.com 发出请求,而是在您的 XHR/AJAX url 参数中使用下面的绝对 url

/steamapi/ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&steamid=76561197960435530&relationship=friend

Apache 会将请求重写为下面的 URI,并将结果代理回给您。您的浏览器不会抱怨,因为您正在向同一个域发出请求。

http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&steamid=76561197960435530&relationship=friend

【讨论】:

  • 对于请求,我可以使用这个代码:var xhr = new XMLHttpRequest(); xhr.open("GET", "http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key="+API_KEY+"&steamid=76561198041707719&relationship=all", false); xhr.send(); var data = JSON.parse(xhr.responseText);
  • 不,这是代理的原因,您的页面无法向 api.steampowered.com 发出请求,因为它是通过 www.example.com 或您的网站加载的。您的请求将是 xhr.open("GET", "/steamapi/ISteamUser/GetFriendList/v0001/?key="+API_KEY+"&ste‌​amid=76561198041707719&relationship=all", false);如果设置正确,Apache 会将其转换为“真实”请求并为您提供结果。
  • 我没有使用网站(因为我没有购买域名),这是我使用的网站:localhost/phishing/example.php,那么如何添加目录?
  • 看起来你在本地运行 Apache。指令还是一样的。您需要知道您的 Web 根目录在您的计算机上的位置。默认情况下是 /var/www。因此,在您上面的示例中,目录将是 /var/www/phishing。您将在 /var/www/steamapi 添加目录。你运行的是什么操作系统?
  • 我正在运行 Windows 8。另外,我使用的是 xampp,它在 http.conf 中说我的文档根目录是 htdocs,这是我保存网络钓鱼文件夹的文件夹。我也应该在那里创建 steampi 文件夹吗?
【解决方案2】:

据我所知,对于 Steam 的公共 API,他们不应该像上面的答案所暗示的那样需要代理来执行 AJAX 请求(我假设您正在这样做),因为它们肯定必须实现 CORS。除此之外,这仅仅是一个浏览器限制,不应该影响任何服务器端。

Dustin 试图解释如何解决的限制是向与您请求的域不同的域上的站点发出 AJAX 请求,该域不允许 CORS(跨源资源共享)。因此,网站会将数据发送到设置为代表其发出请求并返回数据的代理服务器。

您能否详细说明您在尝试提出请求时遇到了哪些错误?

我假设您使用的是此处找到的 API, https://developer.valvesoftware.com/wiki/Steam_Web_API#GetPlayerSummaries_.28v0001.29

在这种情况下,我不得不问,如果您看到所有 X 的位置,这些是该 URI 中的占位符。您应该有一个 Steam Web API 密钥,而不是 Xs,您可以从这里注册:

https://steamcommunity.com/dev/apikey

我不确定域名在注册时是否那么重要,因为我以前曾改变过密钥的用途。

请注意,Valve 的公共 API 非常有限,并且在网络上流传的许多库不使用它们,而是对其主站点进行反向工程 Valve 的 Oauth 登录代码以使用私人的、未记录的网络 API,或者他们以某种方式对桌面客户端本身进行了逆向工程。

【讨论】:

  • 我不熟悉 Steam API 或者它们是否支持 jsonp。使用 jsonp ajax 调用,您还可以向不同的域发出请求。
猜你喜欢
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
  • 2014-08-29
相关资源
最近更新 更多