0
私は、正しく認証された別のユーザから各ユーザリソースを保護する方法を見つけようとしています。だから、これは間違っている流れである:JWT認証と承認
あなたが見ることができるように、アリスは、右のJWTトークンを持っており、彼女は(何とか)ジョンのIDを取得するために管理している場合、彼女はジョンズ情報を取得することができます。私は起こってからこれを保護したい...私はそれを行うことはできますか?
これは私がパスポート認証に使用しているコードです。すべてうまくいく、私はちょうどセキュリティの余分な層を追加しようとしています。
passportTest.js事前に
'use strict';
// load environment variables
require('dotenv').config();
/**
*Module dependencies
*/
const passport = require('passport');
const User = require('../models/user');
let jwt = require('jsonwebtoken');
/**
*Configuration and Settings
*/
const utilities = require('../models/utilities');
const errHandler = utilities.errHandler;
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const LocalStrategy = require('passport-local').Strategy;
const jwtOptions = {
// Telling Passport to check authorization headers for JWT
jwtFromRequest: ExtractJwt.fromAuthHeader(),
// Telling Passport where to find the secret
secretOrKey: process.env.SECRET
};
// Configure Passport to use JWT strategy to look up Users.
passport.use('jwt', new JwtStrategy(jwtOptions, function (jwt_payload, done) {
User.findById({ _id: jwt_payload._doc._id }, (err, user) => {
if (err) {
return done(err, false);
}
if (user) {
return done(null, user);
} else {
return done(null, false);
}
})
}));
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function (req, email, password, done) {
User.findOne({ email: email }, (err, user) => {
if (err) {
return errHandler(err);
}
if (!user) {
return done(null, false, {
errMsg: 'User does not exist, please' +
' <a class="errMsg" href="/signup">signup</a>'
});
}
if (!user.validPassword(password)) {
return done(null, false, { errMsg: 'Invalid password try again' });
}
return done(null, user);
});
}));
/**
*Export Module
*/
module.exports = passport;
Routes.js
'use strict';
// load environment variables
require('dotenv').config();
/**
*Module dependencies
*/
const express = require('express');
const passport = require('../config/passport');
const authChecker = require('../config/authentication-checker');
const passportTest = require('../config/passport-jwt');
let jwt = require('jsonwebtoken');
const utilities = require('../models/utilities');
const userController = require('../controllers/user.controller');
const expressJwt = require('express-jwt');
//==============================================================================
/**
*Create router instance
*/
var router = express.Router();
//==============================================================================
/**
*Module Variables
*/
//needed to protect the '/dashboard' route
function isLoggedIn(req, res, next) {
if (req.headers.authorization) {
passportTest.authenticate('jwt', { session: false }, (err, user) => {
if (err) { return res.status(401); }
if (user) {
req.user = user;
return next();
} else {
return res.status(401);
}
})(req, res, next);
} else {
return res.redirect('/login');
}
}
//==============================================================================
/**
*Middleware
*/
router.use(passport.initialize());
router.use(passport.session());
// Authenticate the user and get a JSON Web Token to include in the header of future requests.
router.route('/auth').post((req, res, next) => {
passportTest.authenticate('local-login', function (err, user, info) {
if (err) {
return next(err); // will generate a 500 error
}
if (!user) {
return res.status(409).render('pages/login', { errMsg: info.errMsg });
}
req.login(user, function (err) {
if (err) {
console.error(err);
return res.status(409);
}
return res.status(200).json(generateToken(user));
});
})(req, res, next);
}
);
// Example of required auth: protect dashboard route with JWT
router.get('/secure', isLoggedIn, function (req, res) {
return res.send('It worked' + req.user);
});
router.route('/signup')
.get(function (req, res) {
return res.render('pages/signup');
})
.post(function (req, res, next) {
passport.authenticate('local-signup', function (err, user, info) {
if (err) {
return next(err); // will generate a 500 error
}
if (!user) {
return res.status(409).render('pages/signup', { errMsg: info.errMsg });
}
req.login(user, function (err) {
if (err) {
console.error(err);
return next(err);
}
return res.redirect('/dashboard');
});
})(req, res, next);
});
router.route('/api/users/id/:id').get(isLoggedIn, userController.getUserById)
感謝。
Sergey?ユーザーのコントローラでは? – Ricardo
このチェックは、エンドポイント・コントローラーで行います。 JWT発行時に設定できると主張しています。パスワードの仕組みを理解するには、パスワードのドキュメントを参照してください。 –
私はそれを動作させることができました。この方法を使用することは、マイクロサービスのアプローチを使用して開始することも可能ですか? – Ricardo