node.js oauth-1.0a适用于twitter api v1.1,但不适用于v2

pwuypxnk  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(467)

我发现此函数用于生成oauth-1.0a标头:

  1. // auth.js
  2. const crypto = require("crypto");
  3. const OAuth1a = require("oauth-1.0a");
  4. function auth(request) {
  5. const oauth = new OAuth1a({
  6. consumer: {
  7. key: process.env.TWITTER_API_KEY,
  8. secret: process.env.TWITTER_API_SECRET_KEY,
  9. },
  10. signature_method: "HMAC-SHA1",
  11. hash_function(baseString, key) {
  12. return crypto.createHmac("sha1", key).update(baseString).digest("base64");
  13. },
  14. });
  15. const authorization = oauth.authorize(request, {
  16. key: process.env.TWITTER_ACCESS_TOKEN,
  17. secret: process.env.TWITTER_ACCESS_TOKEN_SECRET,
  18. });
  19. return oauth.toHeader(authorization).Authorization;
  20. }
  21. module.exports = auth;

如果我在twitter api v1.1中试用,效果会很好:

  1. // v1.js
  2. require("dotenv").config();
  3. const axios = require("axios");
  4. const auth = require("./auth");
  5. const url = "https://api.twitter.com/1.1/favorites/create.json";
  6. const method = "POST";
  7. const params = new URLSearchParams({
  8. id: "1397568983931392004",
  9. });
  10. axios
  11. .post(url, undefined, {
  12. params,
  13. headers: {
  14. authorization: auth({
  15. method,
  16. url: `${url}?${params}`,
  17. }),
  18. },
  19. })
  20. .then((data) => {
  21. return console.log(data);
  22. })
  23. .catch((err) => {
  24. if (err.response) {
  25. return console.log(err.response);
  26. }
  27. console.log(err);
  28. });

但如果我尝试使用twitter api v2:

  1. // v2.js
  2. require("dotenv").config();
  3. const axios = require("axios");
  4. const auth = require("./auth");
  5. const url = `https://api.twitter.com/2/users/${process.env.TWITTER_USER_ID}/likes`;
  6. const method = "POST";
  7. const data = {
  8. tweet_id: "1397568983931392004",
  9. };
  10. axios
  11. .post(url, data, {
  12. headers: {
  13. authorization: auth({
  14. method,
  15. url,
  16. data,
  17. }),
  18. },
  19. })
  20. .then((data) => {
  21. return console.log(data);
  22. })
  23. .catch((err) => {
  24. if (err.response) {
  25. return console.log(err.response);
  26. }
  27. console.log(err);
  28. });

它失败于:

  1. {
  2. title: 'Unauthorized',
  3. type: 'about:blank',
  4. status: 401,
  5. detail: 'Unauthorized'
  6. }

我尝试按照此处的建议对请求主体进行编码,但得到了相同的错误:

  1. require("dotenv").config();
  2. const axios = require("axios");
  3. const auth = require("./auth");
  4. const querystring = require("querystring");
  5. const url = `https://api.twitter.com/2/users/${process.env.TWITTER_USER_ID}/likes`;
  6. const method = "POST";
  7. const data = percentEncode(
  8. querystring.stringify({
  9. tweet_id: "1397568983931392004",
  10. })
  11. );
  12. function percentEncode(string) {
  13. return string
  14. .replace(/!/g, "%21")
  15. .replace(/\*/g, "%2A")
  16. .replace(/'/g, "%27")
  17. .replace(/\(/g, "%28")
  18. .replace(/\)/g, "%29");
  19. }
  20. axios
  21. .post(url, data, {
  22. headers: {
  23. "content-type": "application/json",
  24. authorization: auth({
  25. method,
  26. url,
  27. data,
  28. }),
  29. },
  30. })
  31. .then((data) => {
  32. return console.log(data);
  33. })
  34. .catch((err) => {
  35. if (err.response) {
  36. return console.log(err.response);
  37. }
  38. console.log(err);
  39. });

如果使用postman进行测试,则两个端点(1.1和2)都可以使用相同的凭据正常工作。
关于我在使用v2时做错了什么,或者如何让它与twitterapiv2一起工作,有什么想法吗?
我怀疑这与请求的主体有关,因为这是两个请求之间的主要区别,但未能使其工作。

6l7fqoea

6l7fqoea1#

请想一想,出于某种原因,请求主体不应包含在身份验证中:

  1. require("dotenv").config();
  2. const axios = require("axios");
  3. const auth = require("./auth");
  4. const url = `https://api.twitter.com/2/users/${process.env.TWITTER_USER_ID}/likes`;
  5. const method = "POST";
  6. const data = {
  7. tweet_id: "1397568983931392004",
  8. };
  9. axios
  10. .post(url, data, {
  11. headers: {
  12. authorization: auth({
  13. method,
  14. url,
  15. }),
  16. },
  17. })
  18. .then((data) => {
  19. return console.log(data);
  20. })
  21. .catch((err) => {
  22. if (err.response) {
  23. return console.log(err.response);
  24. }
  25. console.log(err);
  26. });
展开查看全部

相关问题