UNPKG

authorify

Version:

Authorization and authentication system for REST server

242 lines (233 loc) 8.1 kB
/*global describe, before, after, it */ var logger = console; logger.debug = function(){}; logger.info = function(){}; var fs = require('fs'), path = require('path'), should = require('should'), restify = require('restify'), certPath = path.resolve(__dirname, '../lib/config/cert'), authorify = require('../index')({ logger: logger, debug: false, key: fs.readFileSync(path.join(certPath,'/serverCert.key'), 'utf8'), cert: fs.readFileSync(path.join(certPath,'/serverCert.cer'), 'utf8'), ca: fs.readFileSync(path.join(certPath,'/serverCA.cer'), 'utf8'), login: function(id, app, username, password, callback) { if (username === 'username' && password === 'password') { callback(1, ['admin']); } else if (username === 'user' && password === 'pass') { callback(2, ['user']); } else { callback(new Error('user and/or password wrong')); } } }), client = require('authorify-client')({ logger: logger, host: 'localhost', debug: false, key: fs.readFileSync(path.join(certPath,'/clientCert.key'), 'utf8'), cert: fs.readFileSync(path.join(certPath,'/clientCert.cer'), 'utf8'), ca: fs.readFileSync(path.join(certPath,'/serverCA.cer'), 'utf8') }), uuid = require('node-uuid'), id = uuid.v4(), app = uuid.v4(); client.setConfig({ port: 3000, id: id, app: app }); var server = restify.createServer(); server.use(restify.queryParser({ mapParams: false })); server.use(restify.bodyParser()); server.use(authorify.authentication); var ok = function(req, res, next){ res.send({ success: true, session: req.session, content: req.body }); }; describe('Security Manager', function() { before(function() { var sec = authorify.authorization; server.get('/handshake', ok); server.get('/auth', ok); server.get('/logout', function(req, res, next) {res.send('logged out');}); // to test isLoggedIn server.get('/secure/loggedin1', sec.isLoggedIn(), ok); server.get('/secure/loggedin2', sec.isLoggedIn('opt1 == 1', { forbiddenOnFail: true }), ok); server.post('/secure/loggedin2', sec.isLoggedIn('opt1 == 1'), ok); server.get('/secure/loggedin3', sec.isLoggedIn('opt1 == 1', { nextOnError: true }), ok); server.get('/secure/loggedin4', sec.isLoggedIn('opt1 == 1', { forbiddenOnFail: true }), ok); server.post('/secure/loggedin5', sec.isLoggedIn('opt1 == 1'), ok); // to test isSelf server.get('/secure1/user/:user', sec.isSelf(), ok); server.get('/secure2/user/:user', sec.isLoggedIn('opt1 == 1'), ok); // to test isInRole server.get('/secure/roletest1', sec.isInRole('admin'), ok); server.get('/secure/roletest2', sec.isInRole(['user', 'guest']), ok); // to test isSelfOrInRole server.get('/secure/selfrole/:user/somepath', sec.isSelfOrInRole(['admin', 'user']), ok); server.listen(3000); }); after(function() { server.close(); }); it('Security Manager tests', function(done) { client.handshake(function(err, res) { should.not.exist(err); client.authenticate('username', 'password', function(err, res) { should.not.exist(err); done(); }); }); }); describe('isLoggedIn tests', function() { it('should fail to request path without authorization header for a protected path', function(done) { client.get('/secure/loggedin1') .pass() .end(function(err, res) { res.status.should.equal(401); res.body.message.should.equal('not logged in'); done(); }); }); it('should is logged in', function(done) { client.get('/secure/loggedin1') .end(function(err, res) { res.status.should.equal(200); should.not.exist(err); done(); }); }); it('should throw error if missing param', function(done) { client.get('/secure/loggedin2') .end(function(err, res) { res.status.should.equal(403); console.log(res.body.message); done(); }); }); it('should is logged in with param with expected value (GET)', function(done) { client.get('/secure/loggedin2') .query({ opt1: 1 }) .end(function(err, res) { should.not.exist(err); done(); }); }); it('should is logged in with param with expected value (POST)', function(done) { client.post('/secure/loggedin2') .send({ opt1: 1 }) .end(function(err, res) { should.not.exist(err); done(); }); }); it('should decrypt secure body', function(done) { client.post('/secure/loggedin5') .send({ opt1: 1 }) .send({ message: 'secret message' }) .end(function(err, res) { should.not.exist(err); res.body.content.opt1.should.equal(1); res.body.content.message.should.equal('secret message'); done(); }); }); it('should skip to next on error', function(done) { client.get('/secure/loggedin3') .end(function(err, res) { res.status.should.equal(403); res.body.statusCode.should.equal(403); res.body.message.should.equal('opt1 parameter not found'); done(); }); }); it('should forbidden on fail', function(done) { client.get('/secure/loggedin4') .query({ opt1: 2 }) .end(function(err, res) { should.not.exist(res.body.success); res.body.message.should.equal('failed conditions'); res.status.should.equal(403); done(); }); }); }); describe('isSelf tests', function() { it('should pass if user is self', function(done) { client.get('/secure1/user/1') .end(function(err, res) { should.not.exist(err); done(); }); }); it("shouldn't pass if user is not self", function(done) { client.get('/secure1/user/2') .end(function(err, res) { should.not.exist(res.body.success); res.body.message.should.equal('user not allowed'); res.status.should.equal(403); done(); }); }); it('should pass if user is self and param is correct', function(done) { client.get('/secure2/user/1') .query({ opt1: 1 }) .end(function(err, res) { should.not.exist(err); done(); }); }); }); describe('isRoles tests', function() { it('should pass if user is in required role', function(done) { client.get('/secure/roletest1') .end(function(err, res) { should.not.exist(err); done(); }); }); it("shouldn't pass if user is not in required role", function(done) { client.get('/logout') .end(function(err, res) { should.not.exist(err); client.handshake(function(err, res) { should.not.exist(err); client.authenticate('user', 'pass', function(err, res) { should.not.exist(err); client.get('/secure/roletest1') .end(function(err, res) { res.body.message.should.equal('role not allowed'); res.status.should.equal(403); done(); }); }); }); }); }); it('should pass if user is in required role (2nd)', function(done) { client.get('/secure/roletest2') .end(function(err, res) { should.not.exist(err); done(); }); }); }); describe('isSelfOrInRole tests', function() { it('should pass if user is self', function(done) { client.get('/secure/selfrole/2/somepath') .end(function(err, res) { should.not.exist(err); done(); }); }); it('should pass if user is in role', function(done) { client.get('/secure/selfrole/1/somepath') .end(function(err, res) { should.not.exist(err); done(); }); }); }); });