У меня вопрос по токенам. Во-первых, я создал свое приложение без какого-либо API. Существует одна паспортная стратегия JWT. Затем я решил использовать API (финансовый API). Таким образом, когда пользователь зарегистрируется на моем сайте, он автоматически зарегистрируется на этом конкретном API. Суть в том, что мне нужно управлять двумя токенами:
- Токен 1: для личных маршрутов моего приложения (доступ к панели инструментов, добавить некоторые вещи и т. Д. c.)
- токен 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"});
}
});
});
});