Trello回应“无效密钥”

5
我正在尝试使用Node.js的https模块获取Trello板的JSON数据,使用以下URL:

https://trello.com/b/nC8QJJoZ.json

以下是我的代码:
var https = require('https');

https.get('https://trello.com/b/nC8QJJoZ.json', function (res) {
    console.log('statusCode:', res.statusCode);
    console.log('headers:');
    console.log(res.headers);
    res.setEncoding('utf8');

    res.on('data', function (chunk) {
        console.log(chunk);
    });
}).on('error', function (e) {
    console.log('ERROR: ' + e);
});

虽然该URL在浏览器中完美运行,但它返回一个包含字符串“invalid key”的主体,状态为401。以下是输出:

statusCode: 401
headers:
{ 'cache-control': 'max-age=0, must-revalidate, no-cache, no-store',
  'x-content-type-options': 'nosniff',
  'strict-transport-security': 'max-age=15768000',
  'x-xss-protection': '1; mode=block',
  'x-frame-options': 'DENY',
  'x-trello-version': '1.430.0',
  'x-trello-environment': 'Production',
  'set-cookie':
   [ 'dsc=ae78a354044f982079cd2b5d8adc4f334cda679656b3539ee0adaaf019aee48e; Path=
     'visid_incap_168551=/NYMaLRtR+qQu/H8GYry1BCKl1UAAAAAQUIPAAAAAAC1zWDD1JLPowdC
     'incap_ses_218_168551=+/2JSB4Vz0XJO/pWbX4GAxCKl1UAAAAA0pAbbN5Mbs4tFgbYuskVPw
  expires: 'Thu, 01 Jan 1970 00:00:00',
  'content-type': 'text/plain; charset=utf-8',
  'content-length': '12',
  etag: 'W/"c-b1ec112"',
  vary: 'Accept-Encoding',
  date: 'Sat, 04 Jul 2015 07:24:00 GMT',
  'x-iinfo': '1-11281210-11279245 PNNN RT(1435994639565 404) q(0 0 0 -1) r(3 3) U
  'x-cdn': 'Incapsula' }
invalid key

我做错了什么?

1个回答

4

事实证明,我们需要在请求中提供一个Trello API应用程序密钥(从此处生成)。

var https = require('https');
var KEY = '<replace this with your app key>';

https.get('https://trello.com/b/nC8QJJoZ.json?key=' + KEY, function (res) {
    ...
});

对我来说,这似乎是一个奇怪的要求,因为我们没有使用Trello的API端点。(即使我解决了这个问题,我仍然想知道为什么浏览器可以访问资源,但服务器端脚本却不行。)


它看起来可能不像,但我们将其视为我们API的一部分进行处理。看起来像来自浏览器且是公共资源的请求不需要应用程序密钥要求,以便公共板正确加载。 - Aaron Dufour
看起来像是来自浏览器的请求。哦!我想我知道该怎么做了。@AaronDufour,我认为你应该限制在时间窗口内每个IP的请求使用情况。很容易伪造一个请求,使其看起来像是来自浏览器。 - sampathsris
我们通过 IP 进行速率限制。你只需要传递一个应用密钥。为什么你认为伪造浏览器请求是更好的解决方案? - Aaron Dufour
@AaronDufour:我并不认为伪造浏览器请求是更好的。但是有人可以这样做。我会为了科学尝试一下,但绝对不会在我的应用程序上这样做。 - sampathsris
我正在尝试为个人使用在页面中嵌入Trello板。但是/b/nC8QJJoZ.html/b/nC8QJJoZ.js对我来说毫无用处,因为它们不会立即更新。所以我创建了一个简单的Angular应用程序,它使用/b/nC8QJJoZ.json。但是/b/nC8QJJoZ.json不支持CORS。而且我不能在我的Angular应用程序中嵌入Trello应用程序密钥;我不希望用户看到这个密钥。所以我被迫制作一个简单的代理来获取JSON并将其提供给我的应用程序。这就是我遇到问题的原因。 - sampathsris
1
应用程序密钥不一定是机密的。大多数客户端应用程序都会公开它们。我不会担心这个问题。如果您想要CORS,您应该使用/1/ API - /b/:id.json只是使用特定参数调用API。 - Aaron Dufour

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