【问题标题】:Twitter API returns 'Invalid or expired token.'Twitter API 返回“无效或过期的令牌”。
【发布时间】:2020-04-21 03:56:34
【问题描述】:

我有一个不使用很多包的简单应用程序。所以我认为这将是试用 Deno 的绝佳机会,我需要的一个不是第三方模块的包是 Twitter API。我认为没问题,因为我不需要它包含的许多功能。还不如自己写!

所以我编写了一个函数,用于使用 Twitter 文档中的 doc 生成承载令牌:

function getOAuthBearer(consumer_key, consumer_secret) {
    const basic = Buffer.from(`${consumer_key}:${consumer_secret}`).toString('base64')
    const options = {
        url: 'https://api.twitter.com/oauth2/token',
        method: 'POST',
        headers: {
            'Authorization': `Basic ${basic}`,
            'Content-Type': `application/x-www-form-urlencoded;charset=UTF-8`
        },
        body: querystring.stringify({
            'grant_type': 'client_credentials'
        })
    };

    return new Promise((resolve, reject) => {
        request(options, (error, response, body) => {
            if (error) reject(error);
            else resolve(JSON.parse(body).access_token);
        });  
    });
}

哪个有效!我得到了我的不记名令牌,所以我写了一个函数来从这个doc的请求示例中获取一些user_timeline信息

function getUserTimeline(bearer_token) {
    const options = {
        url: 'https://api.twitter.com//1.1/statuses/user_timeline.json?count=100&screen_name=twitterapi',
        method: 'GET',
        headers: {
            'Authorization': 'Bearer ' + Buffer.from(bearer_token).toString('base64'),
        }
    }

    return new Promise((resolve, reject) => {
        request(options, (error, response, body) => {
            if (error) reject(error);
            else resolve(JSON.parse(body));
        });  
    });
}

返回这个:

{ 错误:[ { 代码:89,消息:'无效或过期的令牌。' } ] }

这很奇怪,但我认为我可以使承载无效并请求一个新的承载,我为此编写了这个函数:

function invalideOAuthBearer(consumer_key, consumer_secret, bearer_token) {
    const basic = Buffer.from(`${consumer_key}:${consumer_secret}`).toString('base64');
    const options = {
        url: 'https://api.twitter.com/oauth2/invalidate_token',
        method: 'POST',
        headers: {
            'Authorization': `Basic ${basic}`,
            'Content-Type': `application/x-www-form-urlencoded;charset=UTF-8`
        },
        body: querystring.stringify({
            'access_token': bearer_token
        })
    };

    return new Promise((resolve, reject) => {
        request(options, (error, response, body) => {
            if (error) reject(error);
            else resolve(JSON.parse(body));
        });  
    });
}

但这会返回:

{ 错误:[ { 代码:348,消息:'不允许客户端应用程序使此令牌无效。' } ] }

所以现在我有点卡住了,我尝试重新生成我的凭据,但这并没有多大作用。我在网上搜索,但只能找到有人说这是一个错误/基础设施问题的旧帖子,但由于有这么多应用程序使用 Twitter API,这对我来说似乎不太可能,当然,有些人只是建议使用像 @987654323 这样的包@,我愿意,但就像我说的 Deno 平台没有这样的包:(

【问题讨论】:

  • 我认为您的this discussion 与您的问题有某种关系。
  • 嗯,是的,看起来是这样。威胁消失后,我会在那里发帖

标签: javascript twitter oauth-2.0


【解决方案1】:

不记名令牌不应采用 base64 编码。试试这个:

const options = {
        url: 'https://api.twitter.com//1.1/statuses/user_timeline.json?count=100&screen_name=twitterapi',
        method: 'GET',
        headers: {
            'Authorization': `Bearer ${bearer_token}`,
        }
    }

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2015-04-23
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多