Я использую oauth-1.0a для генерации подписанных заголовков запросов и Ax ios для отправки моих HTTP-запросов с Node.js. Мой запрос POST подкачки токена в 3-х сторонней аутентификации работает успешно (как и запрос GET для получения моего профиля с использованием указанного токена), но запрос состояния POST с использованием почти идентичного кода и предоставленные токены просто возвращают ошибку 401 32.
Рабочий запрос (использующий токен запроса для получения токена oauth):
async swapToken(data: TwitterAccessTokenRequest) {
const { oauth_token, oauth_verifier, oauth_consumer_key, oauth_token_secret } = data;
const oauth = new OAuth({
consumer: {
key: this.app.get('twitter').clientId,
secret: this.app.get('twitter').clientSecret,
},
signature_method: 'HMAC-SHA1',
hash_function(base_string, key) {
return crypto
.createHmac('sha1', key)
.update(base_string)
.digest('base64')
},
});
const token = {
key: oauth_token,
secret: oauth_token_secret
}
const request = {
url: 'https://api.twitter.com/oauth/access_token',
method: 'POST',
data: { oauth_verifier, oauth_token, oauth_consumer_key }
};
try {
const json = await axios.post(request.url, request.data, { headers: oauth.toHeader(oauth.authorize(request, token))});
return json.data.split('&').map(item => item.split('=')).map(i => ({[i[0]] : i[1]})).reduce((newObj, current) => ({...newObj, ...current}), {});
} catch (e) {
logger.error(e);
throw new BadRequest('Error fetching auth token from Twitter');
}
}
Запрос, возвращающий 401 (используя токен / секрет возвращается в предыдущем запросе, в том же формате):
async sendTweet(data: TwitterApiPostStatusRequest) {
const { oauth_token, oauth_token_secret, status, attachment_url, media_ids } = data;
const oauth = new OAuth({
consumer: {
key: this.app.get('twitter').clientId,
secret: this.app.get('twitter').clientSecret,
},
signature_method: 'HMAC-SHA1',
hash_function(base_string, key) {
return crypto
.createHmac('sha1', key)
.update(base_string)
.digest('base64')
},
});
const token = {
key: oauth_token,
secret: oauth_token_secret
}
const request = {
url: 'https://api.twitter.com/1.1/statuses/update.json',
method: 'POST',
data: {
status,
attachment_url
}
};
if(media_ids) {
request['data']['media_ids'] = media_ids;
}
try {
const json = await axios.post(request.url, request.data, { headers: oauth.toHeader(oauth.authorize(request, token))});
return json.data;
} catch (e) {
logger.error(e);
return new BadRequest('Error sending tweet to Twitter');
}
}
Я попытался отправить тело запроса специально как данные формы, попытался отправить все это в теле запроса согласно oauth-1.0a примеры, кажется, ничто не имеет разницы. Есть предложения?