【问题标题】:dropbox api usage in nodejs "Bad oauth_signature for oauth_signature_method"nodejs中的dropbox api使用“oauth_signature_method的oauth_signature错误”
【发布时间】:2025-12-06 11:40:01
【问题描述】:

我一直在尝试连接到保管箱服务器并使用 api,但我在第一步本身就失败了。当我请求请求令牌时,我在 nodejs 中收到 Bad oauth_signature 错误。

我用来连接api的代码如下。(我使用https://github.com/sintaxi/node-dbox/blob/master/README.md library/sdk for nodejs)

/*
 * dropbox handlers controller.
 */

var dbox = require('dbox')
   ,querystring = require("querystring")

var client = dbox.createClient({
    app_key    : 'my-key',             // required
    app_secret : 'my-secret',           // required
    root       : 'sandbox'            // optional (defaults to sandbox)
  })

exports.index = function(req, res){

  client.request_token(function(status, reply){
    console.log(status)
    console.log(reply)
  // {
  //   oauth_token        : "h89r0sdfdsfwiko",  // required
  //   oauth_token_secret : "8hielfflk7100mv",  // required
  // }
  })

我在控制台中得到的结果如下

c:\tmp\dropbox>node app.js Express 服务器在开发模式下监听 3000 端口 oauth_consumer_key=[我的密钥]&oauth_signature=faawn09ehmfe25i%2526&oauth_ti mestamp=1324643574&oauth_nonce=132464357437334176&oauth_signature_method=PLAINTE XT&oauth_version=1.0 403 { '{"error": "oauth_signature_method 的错误 oauth_signature \'PLAINTEXT\'"}': u 未定义}

非常感谢您对此的任何帮助。 提前致谢

【问题讨论】:

  • 感谢您的帮助。但是我在尝试了不同的方式并浏览了很多之后发布了这个。你发布的链接对我没有帮助:(
  • 谢谢大家。问题解决了。如果有人有类似的问题,请使用我在第一篇文章中提到的相同库,但在 ../dbox/lib/oauth.js 文件中找到以下行 options["oauth_signature_method"] = "PLAINTEXT",并更改它to options["oauth_signature_method"] = "HMAC-SHA1",
  • 我之前忘记提到的另一个修改是版本 1 的所有 url 都不起作用。相反,像api.dropbox.com/0/oauth/access_token 这样的网址正在工作。请注意 url 中的 0 而不是 1。如果有 Dropbox 开发人员正在观看此内容,您能告诉我问题出在哪里吗?
  • /0/ url 仅适用于在 v1 为 v1 之前创建的旧应用密钥。展望未来,所有 API 调用都必须指向 /1/ 端点。关于签名问题,看看你是否可以让 ouath_signature_method="PLAINTEXT" 工作。使用纯文本“签名”,您不需要包含随机数或时间戳,创建“签名”要简单得多。

标签: node.js dropbox-api


【解决方案1】:

这是node-dbox的作者。从 0.2.2 版开始,此问题已得到解决。

抱歉给您添麻烦了。

【讨论】:

    【解决方案2】:

    我采用了使用passport 模块及其配套的passport-dropbox 模块的方法来处理与Dropbox 进行身份验证握手所需的路由。一旦您收到在 Dropbox 回调中传递的令牌和令牌秘密,请将它们存储在会话状态或任何位置。然后,您可以在随后的 Dropbox API 调用中将它们传递给 node-dbox。护照的作者在 GitHub 上有一个很好的例子:https://github.com/jaredhanson/passport-dropbox/tree/master/examples/login

    passport.use(new DropboxStrategy({
      consumerKey: DROPBOX_APP_KEY,
      consumerSecret: DROPBOX_APP_SECRET,
      callbackURL: APP_URL + '/auth/dropbox/callback'
    },
    function(token, tokenSecret, profile, done) {
      var user = {
        provider: 'dropbox',
        displayName: profile.displayName,
        email: profile.emails[0].value,
        // I'm choosing to store the token and tokenSecret on the user.
        // The keys must be as shown below to be compatible with node-dbox
        dboxToken: {'oauth_token': token, 'oauth_token_secret': tokenSecret}
      };
    
      return done(null, user);
    }));
    
    
    app.get('/files', function(req, res) {
      var dboxClient = dboxApp.client(req.user.dboxToken);
    
      dboxClient.metadata('/', {}, function(status, reply) {
        res.render('files', {
          pathMetaData: reply,
          user: req.user
        });
      });
    });
    

    【讨论】:

      【解决方案3】:

      要解决该问题,您只需应用此处提到的内容:

      https://github.com/sintaxi/node-dbox/issues/3

      Oauth.js 签名的第 28 行被编码两次。

      var getSignature = function(tokenSecret){
         return encode(consumerSecret) + "&" + encode(tokenSecret)
      }
      var signature = encode(getSignature(secret))
      

      改成下面这样就解决了收不到oauth token的问题。

      var signature = getSignature(secret)
      

      谢谢

      【讨论】: