Twitter API 出现错误 Unauthorized with OAuth 1.0

问题描述 投票:0回答:1

我尝试使用 OAuth 1.0a 和 TS 从 twitter API v2 创建带有 POST /2/tweets 的 API,我认为我的代码很好,但是当我尝试使用 postman 时出现错误:

{ "success": false, "error": { "title": "Unauthorized", "type": "about:blank", "status": 401, "detail": "Unauthorized" } }
。这是我的代码:

// twitter.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import axios from 'axios';
import OAuth from 'oauth-1.0a';
import crypto from 'crypto';
import { ConfigService } from '@nestjs/config'
import { createHmac } from 'crypto';

@Injectable()
export class TwitterService implements OnModuleInit{

  constructor(
    private readonly configService: ConfigService
  )
  {}

  async onModuleInit() {
    console.log('twitterService')
  }

  private readonly consumerKey = 'FaC6d0Ez4LoRCJzZpasiEL3jq';
  private readonly consumerSecret = 'nFNu6UD1jx9LqxhsMXf1zjWzqmCyawa8MqBXCYklxtinuhJG7R';
  private readonly accessToken = '1443624502957514795-USijMxUZ5JHHbxsNhPmIJlpi7cd7rq';
  private readonly tokenSecret = 'a2qjIe31mmbNHYBx7e1j7LwBmiGZeO7UiFBEJhDs9u2ST';

  private readonly oauth = new OAuth({
    consumer: { key: this.consumerKey, secret: this.consumerSecret },
    signature_method: 'HMAC-SHA1',
    hash_function(base_string, key) {
      return createHmac('sha1', key)
        .update(base_string)
        .digest('base64');
    },
  });

  async postTweet(text: string): Promise<any> {
    const request_data = {
      url: 'https://api.twitter.com/2/tweets',
      method: 'POST',
      data: { text },
    };

    const requestData = {
      url: request_data.url,
      method: request_data.method,
      data: request_data.data,
    };

    console.log(requestData)

    const token = {
      key: this.accessToken,
      secret: this.tokenSecret,
    };

    const oauthHeaders = this.oauth.toHeader(this.oauth.authorize(requestData, token));
    const headers: { [key: string]: string } = {
      ...oauthHeaders,
      'Content-Type': 'application/json',
    };

    console.log(oauthHeaders)

    try {
      const response = await axios({
        method: 'post',
        url: request_data.url,
        headers: headers,
        data: JSON.stringify(request_data.data),
      });
      return response.data;
    } catch (error) {
      throw error.response.data;
    }
  }
}

这是我的控制器:

import { Controller, Post, Body } from '@nestjs/common';
import { TwitterService } from './twitter.service';

@Controller('twitter')
export class TwitterController {
  constructor(private readonly twitterService: TwitterService) {}

  @Post('post-tweet')
  async postTweet(@Body() body: { text: string }): Promise<any> {
    try {
      const response = await this.twitterService.postTweet(body.text);
      return { success: true, response };
    } catch (error) {
      return { success: false, error };
    }
  }
}

我指的是这个文档:https://developer.twitter.com/en/docs/authentication/oauth-1-0a

我很确定我正确提供了它所需的所有数据。

typescript twitter nestjs twitter-oauth twitter-api-v2
1个回答
0
投票

你想出来了吗?我也有同样的问题

© www.soinside.com 2019 - 2024. All rights reserved.