Keycloak is an open-source authentication and identity management solution written in Java. It provides a nodejs adapter using which I am able to successfully integrate with express. Here is the routes file which works:
'use strict';
module.exports = function(app) {
var Keycloak = require('keycloak-connect');
var session = require('express-session');
var memoryStore = new session.MemoryStore();
app.use(session({
secret: 'mySecret',
resave: false,
saveUninitialized: true,
store: memoryStore
}));
var keycloak = new Keycloak({
store: memoryStore
});
app.use(keycloak.middleware({
logout: '/logout',
admin: '/'
}));
// var lRController = require('../controllers/LRController');
//
// app.route('/lrs').get(lRController.list_all_lrs).post(lRController.create_a_lr);
var DeliveryOrderController = require('../controllers/DeliveryOrderController');
app.route('/').get(keycloak.protect(), DeliveryOrderController.getAllDos)
app.route('/api/dos').get(keycloak.protect(), DeliveryOrderController.getAllDos).post(DeliveryOrderController.createDo);
app.route('/api/do').put(DeliveryOrderController.updateDo);
app.route('/api/do/:doNumber').get(DeliveryOrderController.getDoByDoNumber);
app.route('/api/do/location/:locationId').get(DeliveryOrderController.getDoByLocation);
app.route('/api/do/branch/:branchId').get(DeliveryOrderController.getDoByBranch);
app.route('/api/do').delete(DeliveryOrderController.deleteDo);
var TransportDeliveryOrderController = require('../controllers/TransportDeliveryOrderController');
app.route('/api/tdos').get(TransportDeliveryOrderController.getAllTdos).post(TransportDeliveryOrderController.createTdo);
app.route('/api/tdo').put(TransportDeliveryOrderController.updateTdo);
app.route('/api/tdo/:tdoNumber').get(TransportDeliveryOrderController.getTdoByTdoNumber);
app.route('/api/tdo/status/:status').get(TransportDeliveryOrderController.getTdoByStatus);
app.route('/api/tdo/status/:status/do/:doNumber').get(TransportDeliveryOrderController.getTdoByStatusAndDo);
};
As you can see in the Delivery order routes, I have two routes(copies of the same route) protected by keycloak.protect()
. I am trying to do the same in sails. I have the following questions for doing that.
a. To integrate keycloak into express the following things are done to protect the routes
Require Keycloak and express session:
var Keycloak = require('keycloak-connect');
var session = require('express-session');
Define a memory store for the storing the sessions:
var memoryStore = new session.MemoryStore();
Include the session as middleware in express
app.use(session({ secret: 'mySecret', resave: false, saveUninitialized: true, store: memoryStore }));
Initiate Keycloak:
var keycloak = new Keycloak({ store: memoryStore });
Include keycloak Middleware into express middleware:
app.use(keycloak.middleware({ logout: '/logout', admin: '/' }));
Protect the route using
keycloak.protect()
app.route('/api/dos').get(keycloak.protect(),DeliveryOrderController.getAllDos).post(DeliveryOrderController.createDo);
I need to establish similar steps in sails. How do I do these things in sails?
I am assuming http.js is where I add middleware. If I do, how do access keycloak in routes.js to use keycloak.protect().
For instance I can add the protect function in the following manner:
'/foo': [
keycloak.protect(),
{ controller: 'user', action: 'find' }
]
Here is the nodejs adapter for keycloak - https://github.com/keycloak/keycloak-nodejs-connect