2016-03-26 14 views
3

Bir MEAN yığın uygulamasının ön ve arka ucunu korumak için Pasaport kullanıyorum. Uygulamanın bu yüzden gibi yapılandırılmıştır: Ben bazen doğru sırayla uygulama ortakatmanını çağırarak meselesi olduğunu biliyorum beriPassport auth işlevi neden bir rota içinde çağrıldığında çalışmıyor?

monstermash 
    config // server configuration 
    public // static directory that will serve the entire Angular frontend 
    app 
     index.js // initialization of the server 
     models 
      index.js // mongoose schemas and models 
     passport 
      index.js // configuration for passport and all my strategies 
     routes 
      index.js // basic route definitions for the API (using functions defined under v1, below) and UI (routes defined inline here for simplicity's sake) 
       v1 
        index.js // all the functions called to power the API routes 

İşte app/index.js var:

var express = require('express'); 
var bodyParser = require('body-parser'); 
var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 
var mongoose = require('mongoose'); 
var app = express(); 
var CONFIG = require('config').BASE; 
var bcrypt = require('bcrypt-nodejs'); 
var passport = require('passport'); 
var flash = require('connect-flash'); 
var models = require('./models'); 

app.passport = require('./passport'); 
app.port = CONFIG.PORT; 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ 
    extended: false 
})); 
app.use(allowCrossDomain); 
app.use(express.static('public')); 
app.use(cookieParser()); 
app.use(session({ 
    secret: 'keyboard cat', 
    resave: true, 
    saveUninitialized: false 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(flash()); 

var routes = require('./routes'); 

app.use(express.static('public', {redirect:false})); 
routes(app) 

module.exports = app 

passport/index.js buna benzer.

localaipkey stratejisi buraya dahil edilmiştir
var models = require('../models') 

passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy 
    , LocalAPIKeyStrategy = require('passport-localapikey-update').Strategy; 

passport.use('localapikey', new LocalAPIKeyStrategy(
    {apiKeyHeader:'x-auth-token'}, 
    function(apikey, done) { 
    console.log('api key'); 
    models.User.findOne({ apikey: apikey }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false); } 
     return done(null, user); 
    }); 
    } 
)); 

passport.use('local-signup', new LocalStrategy(
    function (req, username, password, done) { 
    console.log('trying local'); 
    models.User.findOne({ 
     local: {username: username}, function (err, user) { 
     if (err) { 
      return done(err); 
     } 
     if (!user) { 
      console.log('no user'); 
      return done (null, false); 
     } 

     if (!user.validPassword(password)) { 
      console.log('bad pwd'); 
      return done(null, false); 
     } 
     return done (null, user); 
     } 
    }) 
    } 
)); 

module.exports = passport; 

sadece o eserlerini göstermek için ve yapılandırılır: yorumladı aşımı bit bir sürü sadece hata ayıklama için çıplak kemiklerine bu aşağı almak için bir çaba içerisinde kesilir, Yerel kayıt olanla aynı şekilde.

O zaman benim routes/index.js gibi görünüyor. Giriş formları için HTML burada satır içidir, çünkü bu sadece bir sınavdır. Doğrulama kontrolünden başka bir şey yapmadığımı unutmayın. Buradaki API rotalarından bir tanesi de bunun nasıl kurulduğunu gösteriyor. Buradaki UI kodu bir pasaport eğitiminden kaldırılıyor, çünkü çizim tahtasına geri döndüm ve konuyla ilgili kendi kodumdan kurtuldum.

var v1 = require('./v1'); 

    // API routes as an example. This authentication is called before the route and works fine. 

    module.exports = function(app) { 
    /* API: V1 */ 
    app.route('/v1/monster/:id') 
     .put(
     app.passport.authenticate('localapikey', { session: false }), 
     v1.monster.update) 
     .delete(
     app.passport.authenticate('localapikey', { session: false }), 
     v1.monster.delete 
    ); 

    // My test login routes. Here, authenticate is called inside the route because it's the handler for logging in. 

    app.route('/login') 
     .post(
     function (req, res) { 
      console.log(req.body); 
      app.passport.authenticate('local-signup', { 
      successRedirect: '/root', 
      failureRedirect: '/fail' 
      }); 
     }) 
     .get(function (req,res) { 
     res.send('<!-- views/login.ejs -->\ 
      <!doctype html>\ 
      <html>\ 
      <head>\ 
       <title>Node Authentication</title>\ 
       <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css"> <!-- load bootstrap css -->\ 
       <link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css"> <!-- load fontawesome -->\ 
       <style>\ 
        body  { padding-top:80px; }\ 
       </style>\ 
      </head>\ 
      <body>\ 
      <div class="container">\ 
      \ 
      <form action="/login" method="post">\ 
      <div>\ 
       <label>Username:</label>\ 
       <input type="text" name="username"/>\ 
      </div>\ 
      <div>\ 
       <label>Password:</label>\ 
       <input type="password" name="password"/>\ 
      </div>\ 
      <div>\ 
       <input type="submit" value="Log In"/>\ 
      </div>\ 
     </form>\ 
      \ 
      </div>\ 
      </body>\ 
      </html>'); 
     }); 

Böylece formu form verilerinden bir POST:/login isteği gönderir. Form gövdesi req.body'dadır, ancak doğrulama işlevinde sahip olduğum console.log iletileri hiçbir zaman giriş yapmaz. Form gönderimi yalnızca askıda kalıyor ve askıda kalıyor; Bu yol üzerinde res.send() yok, çünkü kimlik doğrulaması ya geçmeli ya da başarısız olmalı ve hiç bir zaman almayın, ancak tüm app.passport.authenticate() işlevi tamamen atlanacaktır.

Bu konuda çok fazla deneme-yanılma yaptım ve app.passport.authenticate() numaralı telefonu bile kayıtlı olmayan bir stratejinin adıyla çağırırsam aynı şeyin gerçekleştiğini fark ettim: mesaj, o sadece orada değildi gibi rota ile devam ediyor. Yani belki de sorunu olduğunu ve bu neden olur ve localapikey strateji bulunur ve neden olduğunu bilmiyorum rağmen local-signup stratejisi tanıma değil.

Yan not, ben aslında bu formda username ve password küme ile test ediyorum; Boş veya parolasız gönderimleri deneyen ve doğrulama işlevlerini göremeyen birinden bir soru sordum, bu yüzden emin değilim.

+0

Daha kazma iki şeyi gösterir işlev (req, kullanıcı adı, parola, bitmiş) olmalıdır '' İki, bu 'app.passport.authenticate()', yalnızca, işlevinden önce çağrıldığında iyi çalışır, ancak içeri çağrıldığında tamamen atlanmış gibi görünüyor. Sanırım bunlar, daha önce rotanın içine koymanın bütün sebebi, "req" ye erişim vermekti. Dokümanların modası geçmiş olduğunu düşünmeye başladım. – Polisurgist

cevap

4

Yani, benim soruma verilen yanıt temelde "bir rotanın içinde kimlik doğrulaması işlevini çağıramazsınız."

Soruyu silmiyorum çünkü bu fikrin bir yerlerde bazı Passport öğreticilerinden aldığını biliyorum, bu nedenle başka biri daha sonra aynı şeylere avlanabilir. Bunu app.passport.authenticate` `in` passReqToCallback` seçenek yerine `ait TRUE` varsaymak gibi görünüyor, bu yüzden benim doğrulama işlevi yanlış denir FALSE ve bu, Bir:

İlgili konular