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

npm install --save passport-http passport

3、使用

新建一个auth.js,可以看出,核心逻辑在于判断username和传入的是否一致,若验证成功回调done(null, true),否则为done(null, 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中,引入:

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 *