Использование API Dropbox в nodejs "Плохая подпись oauth_signature_method" - PullRequest
3 голосов
/ 23 декабря 2011

Я пытался подключиться к серверу Dropbox и использовать API, но мне не удается на первом шаге сам.Когда я запрашиваю токен запроса, я получаю ошибку Bad oauth_signature в nodejs.

Код, который я использую для подключения к API, выглядит следующим образом (я использую https://github.com/sintaxi/node-dbox/blob/master/README.md library / sdk для 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
  // }
  })

результат, который я получаю в моей консоли:порт 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 {{ "ошибка": "Bad oauth_signature для oauth_signature_method \ 'PLAINTEXT \'"} ': и ndefined}

Любая помощь в этом очень ценится.Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 14 января 2012

Это автор node-dbox. Эта проблема была решена с версии 0.2.2.

Извините за беспокойство.

2 голосов
/ 27 марта 2013

Я использовал подход passport и его сопутствующий модуль passport-dropbox для обработки маршрутов, необходимых для аутентификации с помощью Dropbox. Как только вы получите токен и секрет токена, переданные в обратном вызове Dropbox, сохраните их в состоянии сеанса или где-либо еще. Затем вы можете передать их в node-dbox при последующих вызовах API Dropbox. У автора паспорта есть хороший пример на 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
    });
  });
});
0 голосов
/ 02 января 2012

Чтобы устранить эту проблему, вам просто нужно применить то, что упомянуто здесь:

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

В строке 28 подписи Oauth.js кодируется дважды.

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

Изменение его на следующее решает проблему невозможности получить токен oauth.

var signature = getSignature(secret)

Thx

...