OAuth, node-fetch и Twitter API - PullRequest
       4

OAuth, node-fetch и Twitter API

0 голосов
/ 29 января 2020

Используя пакет twitter для узла Я могу отправлять запросы к конечной точке API Twitter .../statuses/user_timeline.json с моим токеном доступа и ключами / секретами потребителя.

Что Я хочу сделать

Чтобы понять OAuth и основную c http систему ответов на запросы, я пытаюсь воссоздать авторизацию, выполненную пакетом узла twitter, и сделать запрос на выборку узла.

Что я получаю

Я всегда получаю один и тот же ответ 401 Требуется авторизация от Twitter Я не могу понять, что не так с моим авторизационным токеном. Может быть, что-то не так с моим запросом на выборку?

Что я сделал

Следуя описанию на странице разработчика в Твиттере Я написал функцию ниже рассчитать строку авторизации. Используя шаги, описанные на этой странице в Твиттере , моя функция возвращает ту же сигнатуру OAuth, если для параметров даны точно такие же значения.

//twitter.js
const crypto = require('crypto')
module.exports = function(method, url){
    const twitter = {
        oauth_consumer_key      : process.env.TWITTER_KEY,
        oauth_token             : process.env.TWITTER_ACCESS_TOKEN,
        oauth_nonce             : crypto.randomBytes(32).toString('hex'),
        oauth_timestamp         : Math.floor(new Date().getTime() / 1000),
        oauth_signature_method  : 'HMAC-SHA1',
        oauth_version           : '1.0'
    }

    const methodWord     = method.toUpperCase();
    let parameter_string = ''

    Object.keys(twitter).sort().forEach(key => {
        parameter_string += key + '=' + encodeURIComponent(twitter[key]) + '&'
    })

    parameter_string = parameter_string.slice(0, -1)//remove last &
    parameter_string = parameter_string.replace(/!/g, '%21')//replace !'s

    const hmacDigest = crypto.createHmac('sha1', 
        encodeURIComponent(process.env.TWITTER_CONSUMER_SECRET) + '&' 
      + encodeURIComponent(process.env.TWITTER_TOKEN_SECRET))

    hmacDigest.update(
        methodWord + '&' 
      + encodeURIComponent(url) + '&' 
      + encodeURIComponent(parameter_string))

    twitter['oauth_signature'] = hmacDigest.digest('base64')
    let authHeader             = 'OAuth '

    Object.keys(twitter).sort().forEach(key => {
        authHeader += key + '="' + encodeURIComponent(twitter[key]) + '", '
    })
    return authHeader.slice(0, -2)//remove last comma and space, and return
}

Возвращенный токен аутентификации затем используется для GET-запрос извлечения узла на моем express сервере

//server.js
const twitterAuth = require('./twitter')
const twitter_url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'
app.get('/api/twitter', (req, res) => {
    const auth = twitterAuth('GET', twitter_url + '?screen_name=<user_name>')
    fetch(twitter_url + '?screen_name=<user_name>', {
        method: 'GET',
        headers: {
            'Content-Type'  : 'application/json',
            'Authorization' : auth
        }   
    }).then(res => res.json())
    .then(jsonRes => res.status(200).send(JSON.stringify(jsonRes)))
    .catch(err => {
        console.log('Error: ',err)
        res.status(500).send(err)
    })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...