Жетоны двух стратегий: JWT и Bearer - PullRequest
0 голосов
/ 20 апреля 2020

У меня вопрос по токенам. Во-первых, я создал свое приложение без какого-либо API. Существует одна паспортная стратегия JWT. Затем я решил использовать API (финансовый API). Таким образом, когда пользователь зарегистрируется на моем сайте, он автоматически зарегистрируется на этом конкретном API. Суть в том, что мне нужно управлять двумя токенами:

  1. Токен 1: для личных маршрутов моего приложения (доступ к панели инструментов, добавить некоторые вещи и т. Д. c.)
  2. токен 2: для частных маршрутов API (получить элемент, аутентификации и т. Д. c.)

Моя проблема в том, что я не знаю, как управлять этими двумя токенами. Найдите ниже фрагмент моей задней части. Не могли бы вы помочь мне понять логику c этого?

passport. js

const JwtStrategy = require("passport-jwt").Strategy;
const BearerStrategy = require ("passport-http-bearer").Strategy;
const ExtractJwt = require("passport-jwt").ExtractJwt;
const User = require("../models/User");
const keys = require("../config/keys");

const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.SECRET;

module.exports = passport => {
   passport.use(
      new JwtStrategy(opts, (jwt_payload, done) => {
         User.findOne({ _id: jwt_payload.id })
            .then(user => {
               if (user) {
                  return done(null, user);
               } else {
                  return done(null, false);
               }
            })
            .catch(err =>
               console.log({ error: "Error authenticating the user" })
            );
      })
   );

   passport.use(
      new BearerStrategy(opts, function(req, 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' });
         });
   })); 
};

API-маршруты (как вы можете видеть, я не знаю, как управлять функциями cURL и jwt.sign () ...):

router.post( 
   "/login",
   (req, res) => {

      const user = {
         email: req.body.email,
         password: req.body.password
      }

      const {email, password } = req.body;

      const SECRET = keys.SECRET_BRIDGE

       const options = {
           method:'POST',
           url: 'https://sync.bankin.com/v2/authenticate?'+'email='+email+'&password='+password,
           headers:{
              'Bankin-Version': '2019-02-18',
              'Client-Id':keys.BRIDGE_CLIENT_ID,
              'Client-Secret':keys.BRIDGE_PWD 
           }
        };


        jwt.sign({user}, SECRET, { expiresIn: 3600 }, (err, token) => {
         if (err) {
            console.log(err);
         }
         return res.json({
               success: true,
               token: "Bearer " + token,
            });
         }); 


        return rp(options)
        .then(doc => res.status(200).json(doc))
        .catch(err =>
            res.status(400).json({ userAuth: "Error in user authentication in BankinAPI" })
        );

   } 
);

Маршруты применения:

router.post("/login", (req, res) => {
const { errors, isValid } = validateLoginInput(req.body);
if (!isValid) {
   return res.status(400).json(errors);
}
const { email, password } = req.body;
User.findOne({ email }).then(user => {
   if (!user) {
      return res.status(404).json({ email: "Email not found" });
   }


bcrypt.compare(password, user.password).then(isMatch => {
          if (isMatch) {
             const payload = {
                id: user.id,
                user_name: user.user_name
             };
             jwt.sign(payload, SECRET, { expiresIn: 3600 }, (err, token) => {
                if (err) {
                   console.log(err);
                }
                return res.json({
                   success: true,
                   token: "Bearer " + token
                });
             });
          } else {
             return res.status(400).json({ password: "Password Incorrect"});
          }
       });
    });
 });
...