2017-08-01 3 views
1

Keycloak est une solution d'authentification et de gestion d'identité open-source écrite en Java. Il fournit un adaptateur nodejs avec lequel je suis capable de m'intégrer avec express. Voici le fichier itinéraires qui fonctionne:Impossible d'intégrer Keycloak avec Sails. Capable d'intégrer Keycloak à Express

'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); 

}; 

Comme vous pouvez le voir dans les voies de commande de livraison, j'ai deux itinéraires (copies de la même route) protégés par keycloak.protect(). J'essaye de faire la même chose dans les voiles. J'ai les questions suivantes pour le faire.

a. Pour intégrer keycloak en exprimer les choses suivantes sont faites pour protéger les routes

  1. Exiger Keycloak et session express:

    var Keycloak = require('keycloak-connect'); var session = require('express-session');

  2. Définir un magasin de mémoire pour le stockage des sessions:

    var memoryStore = new session.MemoryStore();

  3. Inclure la session comme middleware express

    app.use(session({ secret: 'mySecret', resave: false, saveUninitialized: true, store: memoryStore }));

  4. Initié Keycloak:

    var keycloak = new Keycloak({ store: memoryStore });

  5. Inclure Middleware keycloak dans le middleware express:

    app.use(keycloak.middleware({ logout: '/logout', admin: '/' }));

  6. PROTÉGER le itinéraire à l'aide keycloak.protect()

    app.route('/api/dos').get(keycloak.protect(),DeliveryOrderController.getAllDos).post(DeliveryOrderController.createDo);

Je dois établir des mesures similaires dans les voiles. Comment est-ce que je fais ces choses dans les voiles?

Je suppose que http.js est où j'ajoute middleware. Si oui, comment accéder keycloak dans routes.js pour utiliser keycloak.protect().

Par exemple, je peux ajouter la fonction de protection de la manière suivante:

'/foo': [ 
keycloak.protect(), 
    { controller: 'user', action: 'find' } 
] 

Voici l'adaptateur nodejs pour keycloak - https://github.com/keycloak/keycloak-nodejs-connect

Répondre

1

J'ai finalement trouvé une réponse pour cela. Le problème est que keycloak.middleware() retourne une liste de fonctions et app.use() en est satisfait. Sails prend la liste http.middleware et l'ajoute et appelle app.use dans la liste qui en résulte. Si vous incluez juste le keycloak.middleware() vous avez une liste de fonctions qui inclut un tableau de fonctions. Express ignore le tableau car ce n'est pas une fonction.

Vous devez développer la liste dans des fonctions séparées.Créez un objet keycloak en haut de http et initialisez-le. ensuite mis cela au bas du fichier config/http.js:

function expandList() { 
    var newOrder = []; 
    for (let i in module.exports.http.middleware.order) 
    { 
     var label = module.exports.http.middleware.order[i]; 
     var functor = module.exports.http.middleware[label]; 
     if (functor && functor.constructor === Array) { 
      for (let j in functor) { 
       let newlabel = label + "." + j; 
       newOrder.push(newlabel); 
       module.exports.http.middleware[newlabel] = functor[j]; 
      } 
     } else { 
      newOrder.push(label); 
     } 
    }; 
    module.exports.http.middleware.order = newOrder; 
    return ""; 
} 
var result = init(); 

l'intérieur de l'objet http.middleware vous devez utiliser: keycloakMiddleware: keycloak.middleware(), et l'ajouter à commander tableau .

ajouter également une politique visant à protéger et à appeler comprennent ceci:

var kc = sails.config.http.keycloak.protect(); 
return kc(req, resp, next); 

Hope this helps si vous avez encore besoin de résoudre ce problème.

Peut-être Sails accepter un tableau et l'étendre avant d'appeler express

+0

Une note plus: Vous pourriez avoir une fonction qui effectue une itération sur la liste de middleware et ont Sails appel cette seule fonction. Cela pourrait être inclus dans keycloak-connect lib. – nswartz