Jeff
Jeff

Reputation: 1879

passport.authenticate() using a Promise instead of a Custom Callback

passport.authenticate(), how can I define a Promise instead of using a Custom Ballback?

How to used passport.authenticate() is referenced within here: http://www.passportjs.org/docs/authenticate/

Within this page, there is a section Custom Ballback:

If the built-in options are not sufficient for handling an authentication request, a custom callback can be provided to allow the application to handle success or failure.

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

The Custom Callback is defined as:

function(err, user, info){...}

What I wish to do is replace this Custom Callback with a Promise.

[Promise](resolve, reject)
.then(res => {
})
.catch(err => {
})

How can I do this? Thank you.

Upvotes: 3

Views: 4702

Answers (2)

Jeff
Jeff

Reputation: 1879

Thanks all for your helpful responses @sterling-archer and @el-finito

I had found a related issue within Passport.js Github repository helpful for using Passport to handle passport.authenticate() callback: "Using node's promisify with passport"

export const authenticate = (req, res) =>
  new Promise((resolve, reject) => {
    passport.authenticate(
      [passport strategy],
      { session: false },
      (err, user) => {
        if (err) reject(new Error(err))
        else if (!user) reject(new Error('Not authenticated'))
        resolve(user)
      })(req, res)
    })

Upvotes: 1

eL_Finito
eL_Finito

Reputation: 407

You can use the es6-promisify package. It is very easy to use, here is an example:

const {promisify} = require("es6-promisify");

// Convert the stat function
const fs = require("fs");
const stat = promisify(fs.stat);

// Now usable as a promise!
stat("example.txt").then(function (stats) {
    console.log("Got stats", stats);
}).catch(function (err) {
    console.error("Yikes!", err);
});

Upvotes: 3

Related Questions