首页 > 解决方案 > Twitter API 返回“无效或过期的令牌”。

问题描述

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

因此,我使用Twitter 文档中的这个文档编写了一个生成 Bearer 令牌的函数:

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);
        });  
    });
}

哪个有效!我得到了我的不记名令牌,所以我编写了一个函数来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,这对我来说似乎不太可能,当然,有些人只是建议使用像twitter这样的包,我愿意,但就像我说的 Deno 平台没有这样的包:(

标签: javascripttwitteroauth-2.0

解决方案


不记名令牌不应采用 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}`,
        }
    }

推荐阅读