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.
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.
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