具有访问令牌的Oauth2 GET请求在NodeJS中返回403

时间:2016-02-01 20:30:56

标签: node.js oauth-2.0 access-token http-status-code-403 deviantart-api

我目前正在尝试开发一个使用DeviantArt API的节点应用程序。

所有请求都必须通过Oauth2,因此我决定使用 client_credentials 流程,因为代码将全部为私有。

因此,一旦我在DeviantArt中注册了我的应用程序,我就得到了clientId和clientSecret。

我正在使用 client-oauth2 包进行授权,代码如下所示:

const Oauth2 = require('client-oauth2');

...

function auth() {
  return new Promise((resolve, reject) => {
    let auth = new Oauth2({
      clientId: KEYS.client_id,
      clientSecret: KEYS.client_secret,
      accessTokenUri: AUTH_URL, // https://www.deviantart.com/oauth2/token
      authorizationGrants: ['credentials']
    });

    auth.credentials.getToken()
    .then((data) => {
      resolve({
        token: data.accessToken
      });
    })
    .catch(reject);
  });
}

到目前为止,我正在使用 access_token 。因此,我可以使用此令牌对API执行任何请求,它实际上通过curl和浏览器使用:

https://www.deviantart.com/api/v1/oauth2/browse/newest?access_token={{access_token}}

回到我的节点应用程序中我正在使用请求包,代码如下所示:

const request= require('request');

...

function getDeviations(token) {
  return new Promise((resolve, reject) => {
    request(`https://www.deviantart.com/api/v1/oauth2/browse/newest?
        access_token=${token}`, (error, response, body) => {
      if (error || response.statusCode >= 400) {
        reject({
          error,
          response
        });
      } else {
        // do things and resolve
      }
    });
  });
}

它返回 403 Forbidden

我已经有两天时间撞击键盘,寻找一个只返回403节点的原因。我一直在寻找浏览器,curl和节点请求的差异,但根本没有任何线索......

有谁知道可能会发生什么?

1 个答案:

答案 0 :(得分:1)

我明白了......在标题中伪造用户代理......

function getDeviations(token) {
  return new Promise((resolve, reject) => {
    request({
      url: `https://www.deviantart.com/api/v1/oauth2/browse/newest?
        access_token=${token}`,
      headers: {
        'User-Agent': 'curl/7.44.0'
      }
    }, (error, response, body) => {
      if (error || response.statusCode >= 400) {
        reject({
          error,
          response
        });
      } else {
        // do things and resolve
      }
    });
  });
}

我无法相信这是有效的。