Reputation: 3178
I tried use Dropbox Core API in plain Node.js.
It is programmed as:
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
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