0

I have been trying to use this elegant looking package to authenticate with Jawbone API. But I keep getting this error -

enter image description here

I have configured my "app" with the Jawbone API service to use these Redirect URIs -

enter image description here

My config file looks like this -

module.exports = {

    'server': {
        'protocol'  : 'https',
        'host'      : 'localhost',
        'port'      : 5000,
        'callback'  : '/done',
        'transport' : 'session',
        'state'     :  true
    },

    'jawbone' : {
       'key'        : '6f*********', 
       'secret'     : '9b************************',
       'callback'   : '/connect/jawbone/callback',
       'scope'      : ['basic_read', 'sleep_read'],
    }
}

I've tried to follow the authors examples to produce an app.js like this -

var config      = require('./config');
var express     = require('express');
var session     = require('express-session');
var Grant       = require('grant-express');
var grant       = new Grant(require('./config.js'));
var bodyParser  = require('body-parser') 
var app         = express()
var Purest      = require('purest');
var jawbone     = new Purest({provider:'jawbone'});
var https       = require('https');
var fs          = require('fs');

var logger = require('morgan')

    app.use(logger('dev'))
    app.use(bodyParser.urlencoded({extended:true}));
    app.use(session({secret:'grant'}));
    app.use(grant);

    app.get('/done', function (req, res) {
      console.log(req.query);
      res.end(JSON.stringify(req.query, null, 2));
    });

    /*
jawbone.get('users/@me', {
  auth:{bearer:'[ACCESS_TOKEN]'}
}, function (err, res, body) {
  // body is a parsed JSON object containing the response data
  console.log(body);
})
*/
var sslOptions = {
    key: fs.readFileSync('./.server.key'),
    cert: fs.readFileSync('./.server.crt')
    };
var secureServer = https.createServer(sslOptions, app).listen(config.server.port, function(){
    console.log('Listening on port ' + config.server.port);
});

I assume I'm making a noob-error and probably misreading the documentation or examples. Can someone point out what I have misconfigured?

simo
  • 15,078
  • 7
  • 45
  • 59
Colin
  • 930
  • 3
  • 19
  • 42
  • The `host` value should be `localhost:5000` I know it's kind of misleading. – simo Jul 19 '15 at 21:27
  • Oh, that helps. Now I get a "This webpage has a redirect loop" error. What am I doing wrong with my routes? Can't I just res.send() the results to /done ? – Colin Jul 19 '15 at 21:50
  • The `callback` key contains the path on your server where you want to receive the results. The `/connect/jawbone/callback` route is used internally by Grant, so you can't use that route. Also the `callback` key for the `jawbone` provider overrides the global `callback` key specified for the `server`. Just set the `callback` key for `jawbone` like this `callback:'/handle_callback'` and you'll get the results inside the `/handle_callback` route (all of this is in the docs btw). – simo Jul 19 '15 at 21:59
  • Thank you. I was receiving '{}' and assumed this was a failed auth attempt. But I guess this means success. If you want to submit this as an answer, I'll accept it. Nice work on this module BTW. Thank you. – Colin Jul 20 '15 at 01:22
  • Posted the answer, hopefully it'll be helpful for other people as well. – simo Jul 20 '15 at 07:14

1 Answers1

1

As noted in the comments above your configuration should look like this:

{

    'server': {
        'protocol'  : 'https',
        'host'      : 'localhost:5000',
        'transport' : 'session',
        'state'     :  true
    },

    'jawbone' : {
       'key'        : '6f*********', 
       'secret'     : '9b************************',
       'callback'   : '/handle_jawbone_callback',
       'scope'      : ['basic_read', 'sleep_read'],
    }
}

Currently there is no separate port option, so in case you don't have some sort of virtual host on top of your app, you should append the port number to the host value - host:'localhost:5000.

For callback key you should always set the path on your server where you want to receive the results from the OAuth flow. The /connect/jawbone/callback route that you specify for redirect_uri of your OAuth application is reserved for Grant, so you can't use that route directly.

For example you can set the final route like this: callback:'/handle_jawbone_callback'.

All of this is documented in the module's readme file as well.

simo
  • 15,078
  • 7
  • 45
  • 59