0
votes

I'm using the http-bearer strategy to handle Passport Authentication for OAuth tokens. Here's my strategy:

var passport = require('passport'),
    url = require('url'),
    BearerStrategy = require('passport-http-bearer').Strategy,
    config = require('../config'),
    mongoose = require('mongoose'),
    User = mongoose.model('User'),
    users = require('../../app/controllers/users.server.controller');

module.exports = function() {
    // Use bearer strategy
    passport.use(new BearerStrategy(
        function(token, done) {

            User.findOne({ token: token }, function (err, user) {
                if (err) { return done(err); }
                if (!user) { return done(null, false); }
                return done(null, user, { scope: 'all' });
            });
        }
    ));
};

Here's my express route:

app.route('/auth/bearersignin').post(users.bearerSignin);

And here's my exports.module:

exports.bearerSignin = function(req, res) {
    console.log('bearerSignin', req.user);
    passport.authenticate('bearer', {
        session: false
    })(req, res, function() { // this is the function called after auth
        console.log('inside authenticate', req.user);
        var response = {
            userObj: req.user,
            redirectUrl: req.session.redirectUrl
        };
        res.json(response);
    });
};

The token in question is buried here in the req.user object under req.user.twitter.token:

{
    _id: abc123idnumber,
    photo: 'https://pbs.twimg.com/profile_images/abc123/IMG_2899-square_normal.jpg',
    provider: 'local',
    username: 'userabc123',
    __v: 0,
    created: Tue Aug 23 2016 00:52:20 GMT+0000 (UTC),
    updated: Fri Aug 26 2016 03:53:17 GMT+0000 (UTC),
    freeEventsCount: 1,
    eventsSubscription: false,
    profiles: [],
    roles: [ 'user' ],
    google: {},
    facebook: {},
    twitter: 
     { profilePhoto: 'https://pbs.twimg.com/profile_images/idabc123/square_normal.jpg',
         name: 'Joe Smith',
         token: 'tokenabc123',
         username: 'tonejac',
         id: 'abc123' },
    localAccountExists: true,
    firstName: 'joe',
    email: '[email protected]'
}

How do I pass the token value into the passport.authenticate 'bearer' function above?

1

1 Answers

1
votes

you need to set headers in your http post call.

headers : {'Authorization' : 'Bearer yourtoken'}

If you are using Angular js, you can try this:

var req = {
 method: 'POST',
 url: 'http://example.com',
 headers: {
   'Authorization': 'Bearer '+ token
 },
 data: { test: 'test' }
}

$http(req).then(function(){...}, function(){...});

For more information about http calls , see AngularJs $http documentation.

I hope this helps you.