Ginpei
Ginpei

Reputation: 3178

Dropbox token API returns "Missing client credentials" in Node.js

I tried use Dropbox Core API in plain Node.js.

It is programmed as:

  1. User opens authorize page and get code.
  2. User inputs the code to app.
  3. App send it to Dropbox API.
  4. API returns token.

But I cannot token and API returns error with the message "Missing client credentials".

How should I write code to get token?

Thanks.

EDIT Adding code from the linked gist:

// About API:
// https://www.dropbox.com/developers/core/docs#oa2-authorize
// https://www.dropbox.com/developers/core/docs#oa2-token

var config = require('./config.json');
// OR...
// var config = {
//  'appKey': 'xxxxxxxxxxxxxxx',
//  'secretKey': 'xxxxxxxxxxxxxxx'
// };

var readline = require('readline');
var https = require('https');
var querystring = require('querystring');

// Show authrize page
var url = 'https://www.dropbox.com/1/oauth2/authorize?' +
    querystring.stringify({ response_type:'code', client_id:config.appKey });
console.log('Open and get auth code:\n\n', url, '\n');

// Get the auth code
var rl = readline.createInterface(process.stdin, process.stdout);
rl.question('Input the auth code: ', openRequest);  // defined below

function openRequest(authCode) {
    var req = https.request({
        headers: { 'Content-Type': 'application/json' },
        hostname: 'api.dropbox.com',
        method: 'POST',
        path: '/1/oauth2/token'
    }, reseiveResponse);  // defined below

    // ################################
    // Send code
    // (maybe wrong...)
    var data = JSON.stringify({
        code: authCode,
        grant_type: 'authorization_code',
        client_id: config.appKey,
        client_secret: config.secretKey
    });
    req.write(data);
    // ################################
    req.end();

    console.log('Request:');
    console.log('--------------------------------');
    console.log(data);
    console.log('--------------------------------');
}

function reseiveResponse(res) {
    var response = '';
    res.on('data', function(chunk) { response += chunk; });

    // Show result
    res.on('end', function() {
        console.log('Response:');
        console.log('--------------------------------');
        console.log(response);  // "Missing client credentials"
        console.log('--------------------------------');
        process.exit();
    });
}

Upvotes: 1

Views: 907

Answers (1)

user94559
user94559

Reputation: 60143

This part of your code is wrong:

var data = JSON.stringify({
    code: authCode,
    grant_type: 'authorization_code',
    client_id: config.appKey,
    client_secret: config.secretKey
});
req.write(data);

You're sending a JSON-encoded body, but the API expects form-encoding.

I'd personally suggest using a higher-level library like request to make it easier to send form-encoded data. (See my use here: https://github.com/smarx/othw/blob/master/Node.js/app.js.)

But you should be able to use querystring encoding here. Just replace JSON.stringify with querystring.stringify:

var data = querystring.stringify({
    code: authCode,
    grant_type: 'authorization_code',
    client_id: config.appKey,
    client_secret: config.secretKey
});
req.write(data);

Upvotes: 1

Related Questions