2017-03-14 5 views
0

以下のミドルウェア機能はreq.userにアクセスしたり、チェックすることはできません定義されていないユーザーは、ユーザーがログインした後にログインされている。req.userはExpress.js Passport.js

私はpassport.serializeUserがあることを知っていますログイン後に成功し、reqはミドルウェア機能からアクセスされた時点で定義されています。

私はノードとそのパッケージを初めて使用しているので、何か基本的なものがありません。どんな助けでも大歓迎です。

ミドルウェア機能:

app.use('/private/*', function(req, res, next) { 
    console.log(req.user); // returns undefined 
    console.log(req.isAuthenticated()) // returns false 
    res.redirect('/') 
}); 

全コード:

var express = require('express'), 
    cookieParser = require('cookie-parser'), 
    session = require('express-session'), 
    passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    bodyParser = require('body-parser'), 
    flash = require('express-flash'), 
    http = require('http'); 

var app = express() 

app.use(flash()); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ 
    extended: true 
})); 
app.use(session({ 
secret: 'akdsgklasdglkadsgladsglk', 
resave: true, 
saveUninitialized: true, 
cookie: { secure: true } 
})); 
app.use(passport.initialize()) 
app.use(passport.session()) 
app.use(cookieParser('sdagahafdhfdshdfshfsd')) 

// Store users 
var users = {} 

// Configure passport validation 
function get_pass(username, password, callback) { 
var params = { 
      "username": username, 
      "password": password, 
      "app_token": 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 
      "app_version": '1.0' 
     } 

var options = { 
    hostname: 'sub_domain.domain.com', 
    path: '/path/path/path/authenticate', 
    method: 'POST', 
    headers: { 
     'Content-Type': 'application/json', 
    } 
}; 

var plasma_req = http.request(options, function(plasma_res) { 
    if (plasma_res.statusCode === 201) { 
     // Login passed 
     plasma_res.setEncoding('utf8'); 
     let rawData = ''; 
     plasma_res.on('data', (chunk) => rawData += chunk); 
     plasma_res.on('end',() => { 
      try { 
       let parsedData = JSON.parse(rawData); 
       var user = {'username': parsedData['user']['username'], 
        'fname': parsedData['user']['first_name'], 
        'lname': parsedData['user']['last_name'], 
        'user_id': parsedData['user']['user_id'], 
        'email': parsedData['user']['email'] 
       }; 
       // add user to local database 
       users["id" + user['user_id']] = user 
       callback([true, user]) 
      } catch (e) { 
       console.log(e.message); 
      } 
     }); 
    } else { 
     // Login failed 
     console.log('Failed Status: ' + plasma_res.statusCode); 
     callback([false, {}]) 
    } 
}); 
plasma_req.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
}); 
plasma_req.write(JSON.stringify(params)); 
plasma_req.end(); 
} 

// Define passport strategy 
passport.use(new LocalStrategy(
function (username, password, done) { 
    status = get_pass(username, password, function(status) { 
     if (status[0]) { 
      console.log("Success") 
      // return true 
      return done(null, status[1]) 
     } else { 
      console.log("Failure", status) 
      // return false 
      return done(null, false, { message: "Incorrect credentials"}) 
     } 
    }); 
} 
)); 

// Serialise user 
passport.serializeUser(function (user, done) { 
if (users['id' + user.user_id]) { 
    done(null, 'id' + user.user_id); 
} else { 
    done(new Error("CANT_SERIALIZE_THIS_USER")); 
} 
}); 

// Deserialise user 
passport.deserializeUser(function (userid, done) { 
if (users[userid]) { 
    done(null, users[userid]); 
} else { 
    done(new Error("THAT_USER_DOESNT_EXIST")); 
} 
}); 

// Login 
app.post('/login', passport.authenticate('local', { 
successRedirect: '/', 
failureRedirect: 'login', 
successFlash: {message : 'Welcome!'}, 
failureFalse: true 
})); 

app.use('/private/*', function(req, res, next) { 
    console.log(req.user); // returns undefined 
    console.log(req.isAuthenticated()) // returns false 
    res.redirect('/') 
}); 
app.use(express.static(__dirname + '/public')) 

// Serve it up 
var PORT = process.env.PORT || 3000; 
app.listen(PORT, function() { 
console.log('Server running @ port ' + PORT) 
}) 

答えて

0

が問題に

var express = require('express'), 
cookieParser = require('cookie-parser'), 
session = require('express-session'), 
passport = require('passport'), 
LocalStrategy = require('passport-local').Strategy, 
bodyParser = require('body-parser'), 
flash = require('express-flash'); 

var app = express() 

app.use(flash()); 
app.use(session({ 
    secret: 'cat_on_keyboard', 
    resave: false, 
    saveUninitialized: true, 
    cookie: { secure: false } 
})); 

app.use(cookieParser('cat_on_keyboard')) 
app.use(passport.initialize()) 
app.use(passport.session()) 

app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json()); 

// Store users 
var users = { 
    "id1" : { user_id: 1, username: "admin", password: "admin"} 
}; 

// Config passport local 
passport.use(new LocalStrategy(
    function (username, password, done) { 
     for (userid in users) { 
      var user = users[userid]; 
      if (user.username.toLowerCase() == username.toLowerCase()) { 
       if (user.password == password) { 
        return done(null, user) 
       } 
      } 
     } 
     return done(null, false, { message: "Incorect credentials" }); 
    } 
)); 

// Serialise user 
passport.serializeUser(function (user, done) { 
    if (users['id' + user.user_id]) { 
     done(null, 'id' + user.user_id); 
    } else { 
     done(new Error("CANT_SERIALIZE_THIS_USER")); 
    } 
}); 

// Deserialise user 
passport.deserializeUser(function (userid, done) { 
    if (users[userid]) { 
     done(null, users[userid]); 
    } else { 
     done(new Error("THAT_USER_DOESNT_EXIST")); 
    } 
}); 

app.get('/', function (req, res) { 
    console.log(req.flash()); 

    h_page = '<h1>Title of landing page</h1>' + 
    '<a href="/login"><div style="display: inline-block; padding: 5px; margin: 10px; border-radius: 3px; border: 1px solid grey; cursor: pointer; background-color: #F8F8F8;"><span>Log In</span></div></a>' + 
    '<a href="/private"><div style="display: inline-block; padding: 5px; margin: 10px; border-radius: 3px; border: 1px solid grey; cursor: pointer; background-color: #F8F8F8;"><span>Private</span></div></a>'; 

    res.send(h_page) 
}); 

app.get("/login", function (req, res) { 
    var error = req.flash("error"); 
    var form = '<!DOCTYPE html>' + 
    '<html>' + 
    ' <body>HTML Login form</body>' + 
    '</html>'; 

    res.send(form); 
}); 

// Login 
app.post('/login', passport.authenticate('local', { 
    successRedirect: '/private', 
    failureRedirect: '/login', 
    successFlash: {message : 'Welcome!'}, 
    failureFlash: true 
})); 

app.get('/private', authenticateOrNot, function(req, res) { 
    console.log(req.flash('success')); 
    res.end('Secrets'); 
}); 

function authenticateOrNot (req, res, next) { 
    if (req.isAuthenticated()) { 
     next() 
    } else { 
     console.log("Unathenticated user, redirecting to login"); 
     res.redirect('/login') 
    } 
} 

// Serve it up 
var PORT = process.env.PORT || 8080; 
app.listen(PORT, function() { 
    console.log('Server running @ port ' + PORT) 
}) 
を修正
関連する問題