1. passport介绍
Passport项目是一个基于Nodejs的认证中间件。Passport目的只是为了“登陆认证”,因此,代码干净,易维护,可以方便地集成到其他的应用中。
Web应用一般有2种登陆认证的形式,这些都是passport支持哒!
- 用户名和密码认证登陆
- OAuth认证登陆
Passport可以根据应用程序的特点,配置不同的认证机制。本文将介绍,用户名和密码的认证登陆。
本文主要讲解使用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的文档。