Два запроса Twitter API отформатированы одинаково - один пост, а один - 401 - PullRequest
1 голос
/ 06 апреля 2020

Я использую 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 примеры, кажется, ничто не имеет разницы. Есть предложения?

...