Express中使用passport快速完成身份验证

1. passport介绍

Passport项目是一个基于Nodejs的认证中间件。Passport目的只是为了“登陆认证”,因此,代码干净,易维护,可以方便地集成到其他的应用中。

Web应用一般有2种登陆认证的形式,这些都是passport支持哒!

  • 用户名和密码认证登陆
  • OAuth认证登陆

Passport可以根据应用程序的特点,配置不同的认证机制。本文将介绍,用户名和密码的认证登陆。

项目网站:http://passportjs.org/

本文主要讲解使用passport完成Basic Auth身份认证方法,并应用于Express构建的Restful API上(如果你早些年用过FTP的话,一定对 ftp://user:pass@xxx.com这种方式不陌生,对,就是这种认证!)

2.安装

passport有200多种认证方案组成,我们这里用的Basic Auth,需要安装passport-http以及passport

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm install --save passport-http passport
npm install --save passport-http passport
npm install --save passport-http passport

3、使用

新建一个auth.js,可以看出,核心逻辑在于判断username和传入的是否一致,若验证成功回调done(null, true),否则为done(null, false)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var passport = require('passport');
var passportHttp = require('passport-http');
var config = require('../config');
// passport setup
passport.use(new passportHttp.BasicStrategy(
function(username, password, done) {
// config user & pass must be valid
if(!config.username || !config.password){
return done(null, false);
}
// check if equals
if(username == config.username && password == config.password){
return done(null, true);
} else{
return done(null, false);
}
}
));
exports.isAuthenticated = passport.authenticate('basic', { session : false });
var passport = require('passport'); var passportHttp = require('passport-http'); var config = require('../config'); // passport setup passport.use(new passportHttp.BasicStrategy( function(username, password, done) { // config user & pass must be valid if(!config.username || !config.password){ return done(null, false); } // check if equals if(username == config.username && password == config.password){ return done(null, true); } else{ return done(null, false); } } )); exports.isAuthenticated = passport.authenticate('basic', { session : false });
var passport = require('passport');
var passportHttp = require('passport-http');

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

// passport setup
passport.use(new passportHttp.BasicStrategy(
    function(username, password, done) {
        // config user & pass must be valid
        if(!config.username || !config.password){
            return done(null, false);
        }
        // check if equals
        if(username == config.username && password == config.password){
            return done(null, true);
        } else{
            return done(null, false);
        }
    }
));

exports.isAuthenticated = passport.authenticate('basic', { session : false });

然后在app.js中,引入:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var users = require('./routes/users');
// requuire
var passport = require('passport');
var auth = require('./routes/auth');
// 必须在route前初始化
app.use(passport.initialize());
// 在需要保护的endpoint上,插入第2个回调函数
app.use('/api', auth.isAuthenticated, api);
var users = require('./routes/users'); // requuire var passport = require('passport'); var auth = require('./routes/auth'); // 必须在route前初始化 app.use(passport.initialize()); // 在需要保护的endpoint上,插入第2个回调函数 app.use('/api', auth.isAuthenticated, api);
var users = require('./routes/users');

// requuire
var passport = require('passport');
var auth = require('./routes/auth');

// 必须在route前初始化
app.use(passport.initialize());

// 在需要保护的endpoint上,插入第2个回调函数
app.use('/api', auth.isAuthenticated, api);

4、测试

curl -u admin:admin 127.0.0.1:3333/api/status

如果密码不符,就会提示401 Unauthroized。如果成功,就能直接访问页面啦。

5、后记

如果大家拿抓包软件仔细看一下,可以发现Basic Auth实际非常不安全,在每次请求API的时候,都会发送用户名和密码,所以在实际应用中,我们可以用OAuth等基于Token的方案。感兴趣的大家可以自行参考passport的文档。

 

Leave a Reply

Your email address will not be published. Required fields are marked *