2015-12-25 3 views
2

Я не могу понять, как заставить koa работать с базовой аутентификацией. У меня нет проблем с локальной стратегией. Поэтому я думал, что могу легко реализовать базовый auth. Моя домашняя страница - это форма, которая отправляется в/логин.koa, стратегия паспорта-http: базовая аутентификация не работает

Это auth.js:

'use strict'; 

let passport = require('koa-passport'), 
    co = require('co'), 
    monk = require('monk'), 
    wrap = require('co-monk'), 
    db = monk('localhost/test'), 
    users = wrap(db.get('users')); 

function *getUser(username, password) { 
    let user = yield users.findOne({username: username, password: password}); 
    return user; 
}; 

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

passport.deserializeUser(function(id, done) { 
    done(null, id) 
}) 

let BasicStrategy = require('passport-http').BasicStrategy 
passport.use(new BasicStrategy(function(username, password, done) { 
    co(function *(next) { 
    try { 
     return yield getUser(username, password); 
    } catch (ex) { 
     console.log('error: ', ex); 
     return null; 
    } 
    }).then(function(user) { 
    done(null, user); 
    }); 
})); 

Это server.js:

/* jshint node: true */ 

'use strict'; 

let koa = require('koa'); 

let app = koa(); 

// sessions 
let session = require('koa-generic-session'); 
app.keys = ['your-session-secret']; 
app.use(session()); 

// body parser 
let bodyParser = require('koa-bodyparser'); 
app.use(bodyParser()); 

// authentication 
require('./auth'); 
let passport = require('koa-passport'); 
app.use(passport.initialize()); 
app.use(passport.session()); 

// append view renderer 
let views = require('koa-render'); 
app.use(views('./views', { 
    map: { html: 'handlebars' }, 
    cache: false 
})) 

// public routes 
let router = require('koa-router'); 

let pub = new router(); 

pub.get('/', function*() { 
    this.body = yield this.render('login'); 
}) 

pub.post('/login', 
    passport.authenticate('basic', { 
    session: false 
    }) 
) 

pub.get('/logout', function*(next) { 
    this.logout(); 
    this.redirect('/'); 
}) 

app.use(pub.routes()); 
app.use(pub.allowedMethods()); 


app.use(function*(next) { 
    if (this.isAuthenticated()) { 
    yield next 
    } else { 
     this.redirect('/') 
    } 
}) 

var secured = new router() 

secured.get('/app', function*(next) { 
    this.body = yield this.render('app'); 
}) 


app.use(secured.routes()); 
app.use(secured.allowedMethods()); 

app.listen(3000); 

Использование узла 4.2.3 и эти версии пакетов я использую:

"dependencies": { 
"co": "^4.6.0", 
"co-monk": "^1.0.0", 
"handlebars": "^4.0.5", 
"koa": "^1.1.2", 
"koa-bodyparser": "^2.0.1", 
"koa-generic-session": "^1.10.1", 
"koa-passport": "^1.2.0", 
"koa-render": "^0.2.1", 
"koa-router": "^5.3.0", 
"monk": "^1.0.1", 
"passport-http": "^0.3.0" 
} 

После того как я скомпилирую форму и отправлю свою регистрационную форму, я получаю:

Request URL:http://localhost:3000/app 
Request Method:GET 
Status Code:302 Found 
Remote Address:[::1]:300 

Это всего лишь образец, который я знаю, пароль должен быть хэширован, но я просто пытался заставить его работать. Любые идеи будут высоко оценены. Заранее спасибо

ответ

1

Я нашел решение. Это было довольно просто. Отправьте его сюда для всех, кто может быть заинтересован.

Просто комментарий:

// app.use(function*(next) { 
// if (this.isAuthenticated()) { 
//  yield next 
// } else { 
//  this.redirect('/') 
// } 
// }); 

и изменить обеспеченному маршрут к:

secured.get('/app', passport.authenticate('basic', { 
    session: false}), function*(next) { 
    this.body = yield this.render('app'); 
}); 

Таким образом аутентификации промежуточного слоя вызывается, когда вы пытаетесь получить доступ к защищенному маршруту.

Смежные вопросы