Maihan Nijat
Maihan Nijat

Reputation: 9344

How to bind or pass req parameter to Passport.js JWT Strategy?

I want to store information in the database when user is authenticated. The information is coming form the client in the request. The following code throws error, saying req is not defined.

Controller:

exports.verifySession = async function(req, res, next) {
  let responses = [];
  passport.authenticate('jwt', async (error, result) => {
    if (error) {
      email.sendError(res, error);
    } else if (result === false) {
      responses.push(new CustomResponse(1).get());
      return res.status(422).json({ data: { errors: responses } });
    }
    if (result.SessionToken) {
      return res.status(200).json('valid');
    } else {
      return res.status(401).json();
    }
  })(req, res, next);
};

And passport.js:

passport.use(
  new JWTstrategy(
    {
      // We expect the user to send the token as a query paramater with the name 'token'
      jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
      // Secret we used to sign our JWT
      secretOrKey: config.jwtkey
    },
    async (token, done) => {
      console.log(req.body);
      try {
        const user = new User();
        user.UserID = token.user.UserID;
        user.SessionToken = token.user.SessionToken;
        user.SessionDate = token.user.SessionDate;
        user.ProviderID = token.user.ProviderID;
        // Verify session token
        await user.verifySessionToken(user, async (error, result) => {
          if (error) {
            return done(error);
          } else if (result.returnValue === 0) {
            return done(null, token.user);
          } else if (result.returnValue !== 0) {
            return done(null, result);
          }
        });
      } catch (error) {
        done(error);
      }
    }
  )
);

Upvotes: 3

Views: 2963

Answers (1)

Ravi Shankar Bharti
Ravi Shankar Bharti

Reputation: 9268

You can use passReqToCallback feature of passport to pass your request body to passport.

From passport.js official docs :

The JWT authentication strategy is constructed as follows:

new JwtStrategy(options, verify)

options is an object literal containing options to control how the token is extracted from the request or verified.

... ...

passReqToCallback: If true the request will be passed to the verify callback. i.e. verify(request, jwt_payload, done_callback).

You can try this:

passport.use(new JWTstrategy({
    // We expect the user to send the token as a query paramater with the name 'token'
    jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),

    // Secret we used to sign our JWT
    secretOrKey: config.jwtkey,

    //this will help you to pass request body to passport
    passReqToCallback: true
}, async (req, token,done) => {

    //req becomes the first parameter
    // now you can access req.body here
})

Note: req becomes the first parameter of callback function instead of token, when you use passReqToCallback

Upvotes: 8

Related Questions