Используя пакет 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)
})
})