2015-07-06 3 views
0

Я попытался обеспечить аутентификацию паспорта на URL-адрес Rest.Узел паспорта Аутентификация URL-адрес REST

var isAuthenticated = function (req, res, next) { 
    var isAuthenticated = function (req, res, next) 
    if (req.isAuthenticated()) 
    return next(); 
    res.redirect('/'); 
}; 

Но, пытаясь получить:

router.get('/edit_grm_user/:user_id',isAuthenticated, function(req, res,next){[...]} 

Я получил эту ошибку:

if (req.isAuthenticated()) 
     ^ 
TypeError: Cannot read property 'isAuthenticated' of null 

получая URL без каких-либо Params внутри, нет никакой ошибки т.е.

router.post('/create_grem_user',isAuthenticated, function(req, res, next){[...]} 

У кого-нибудь есть решение для это?

ответ

1

Хотите знать, почему вы определяя два раза isAuthenticated:

var isAuthenticated = function (req, res, next) { 
    var isAuthenticated = function (req, res, next) 

В любом случае я создал пример имитируя свой контекст:

// Express server 
var express = require('express'); 
var app = express(); 

// Passport 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

// Middlewares 
var flash = require('connect-flash'); 
var bodyParser = require('body-parser'); 
var cookieParser = require('cookie-parser'); 
var methodOverride = require('method-override'); 
var session = require('express-session'); 

var users = [ 
    { 
    id: 1, 
    username: 'wilson', 
    password: 'secret', 
    email: '[email protected]' 
    } 
]; 

function findUserById(id, cb) { 
    var idx = id - 1; 
    var user = users[idx]; 

    if (user) { 
    cb(null, user); 
    } else { 
    fn(new Error('User ' + id + ' does not exist.')); 
    } 
} 

function findUserByUsername(username, cb) { 
    var userFound = null; 

    users.some(function(user) { 
    if (user.username === username) { 
     userFound = user; 
     return true; 
    } 
    }); 

    return cb(null, userFound); 
} 

function isAuthenticated(req, res, next) { 
    if (req.isAuthenticated()) { 
    return next(); 
    } 

    next(new Error('You are not authenticated!.\n')); 
} 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    findUserById(id, done); 
}); 

passport.use(new LocalStrategy(function(username, password, done) { 
    process.nextTick(function() { 
    findUserByUsername(username, function(err, user) { 
     if (err) return done(err); 
     if (!user) return done(null, false, {message: 'Unknown user ' + username}); 
     if (user.password !== password) return done(null, false, {message: 'Invalid Password.'}); 

     return done(null, user); 
    }); 
    }); 
})); 

app.use(cookieParser()); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(methodOverride()); 
app.use(session({ 
    secret: 'mysecret', 
    resave: false, 
    saveUninitialized: true 
})); 

app.use(flash()); 
app.use(passport.initialize()); 
app.use(passport.session()); 

app.post(
    '/auth', 
    passport.authenticate('local', {}), 
    function(req, res, next) { 
    res.send('You just authenticated!\n'); 
    } 
); 

app.get('/get-route/:something', isAuthenticated, function(req, res, next) { 
    var something = req.params.something; 
    res.send('hello from get-route here is your param: '+ something +'\n'); 
}); 

app.post('/post-route', isAuthenticated, function(req, res, next) { 
    res.send('hello from post-route\n'); 
}); 

// handling errors 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500).send(err.message); 
}); 

app.listen(4040, function() { 
    console.log('server up and running'); 
}); 

Где /get-route/:something и /post-route может потребляться только авторизованным пользователям.

Так что, если вы попробуете использовать /get-route/:something, не проверяя подлинность себя, вы увидите сообщение, которое гласит: You are not authenticated!.

Сначала вы должны потреблять /auth прохождение по имени пользователя и пароля и для этого примера уже есть пользователь хранится: Имя пользователя: wilson, пароль: secret, так что после аутентификации с этим учетными данными вы сможете потреблять маршруты, защищенные ,

ПРИМЕЧАНИЕ: Вы должны быть установлены следующие библиотеки:

"dependencies": { 
    "body-parser": "^1.13.2", 
    "cookie-parser": "^1.3.5", 
    "express": "^4.13.1", 
    "connect-flash": "^0.1.1", 
    "express-session": "^1.11.3", 
    "method-override": "^2.3.3", 
    "passport": "^0.2.2", 
    "passport-local": "^1.0.0" 
    } 
Смежные вопросы