Source: config.example/config.js

/**
 * This file is part of Sesatheque.
 *   Copyright 2014-2015, Association Sésamath
 *
 * Sesatheque is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License version 3
 * as published by the Free Software Foundation.
 *
 * Sesatheque is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with Sesatheque (LICENCE.txt).
 * @see http://www.gnu.org/licenses/agpl.txt
 *
 *
 * Ce fichier fait partie de l'application Sésathèque, créée par l'association Sésamath.
 *
 * Sésathèque est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant
 * les termes de la GNU Affero General Public License version 3 telle que publiée par la
 * Free Software Foundation.
 * Sésathèque est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ;
 * sans même la garantie tacite de QUALITÉ MARCHANDE ou d'ADÉQUATION à UN BUT PARTICULIER.
 * Consultez la GNU Affero General Public License pour plus de détails.
 * Vous devez avoir reçu une copie de la GNU General Public License en même temps que Sésathèque
 * (cf LICENCE.txt et http://vvlibri.org/fr/Analyse/gnu-affero-general-public-license-v3-analyse
 * pour une explication en français)
 */

'use strict'

/**
 * Exemple de configuration, à fusionner à la conf d'un sesalab ou d'une sesathèque
 * À priori sesalab est serveur d'authentification et les Sésathèque clientes,
 * mais une Sésathèque pourrait être serveur d'authentification pour d'autres, sans sesalab.
 */

module.exports = {
  application: {
    // …
  },
  components: {

    // conf des autres composants

    sesalabSso: {
      prefix: 'sesalabSso',

      // //////////////////////////////////////////
      // Si on est un serveur d'authentification
      // //////////////////////////////////////////

      clients: [
        {
          name: 'Nom affiché à l’utilisateur à la déconnexion',
          baseUrl: 'http://domaine.tld/',
          prefix: 'sesalabSso',

          // facultatif, si non fourni on vérifiera que l'ip correspond à baseUrl
          // peut être une ip (v4 ou v6, celle du client qui rappellera notre validate)
          // ou une RegExp
          // ou une fct (qui doit renvoyer un booléen en reçevant une ip)
          ip: ''
        }
      ],
      // url de retour ici après propagation sur tous les clients
      afterClientsPage: '/',
      // url de retour ici après un pb sur un client (avec un message explicite dans ?error=)
      errorPage: 'chemin/local/pour/afficher/une/erreur',
      // @todo affiche le formulaire de login pour un client qui réclame une authentification
      // il faudra rediriger vers l'url qu'il demande en retour et le stocker comme client authentifié
      loginPage: 'todo',
      // @todo affiche la liste des déconnexions des clients (fait les appels en ajax)
      logoutPage: 'todo',

      // //////////////////
      // Si on est client
      // //////////////////

      // on indique une liste de serveurs d'authentification
      // - que l'on pourra appeler pour s'authentifier
      // - qui pourront nous propager des login utilisateurs
      authServers: [
        {
          // facultatif, un nom à afficher sur le client (sinon sera le domaine de baseUrl)
          name: '',
          // url absolue avec / de fin
          baseUrl: '',
          // un préfixe d'url, facultatif
          prefix: 'sesalabSso',
          // pour demander un login, form d'authentification
          loginPage: '',
          // pour demander un logout, page qui fera toutes les déconnexions en ajax et affichera le résultat
          logoutPage: '',
          errorPage: '',
          // si non fourni on vérifiera que l'ip correspond à baseUrl
          // peut être une ip (v4 ou v6, celle du client qui rappellera notre validate)
          // ou une RegExp
          // ou une fct (qui doit renvoyer un booléen en reçevant une ip)
          ip: ''
        }
      ],

      // Client : une callback pour loguer un user ici, cette fonction sera appelée après un validate réussi,
      // le user est envoyé par le serveur d'authentification et mis au format User
      // s'il est impossible de fournir la callback ici (car services pas encore dispo dans cette config)
      // utiliser $sesalabSsoClient.setLoginCallback plus tard
      // loginCallback: function (context, user, next) { /* … */ },

      // Client : callback appelée par le controleur logout (qui répond en json à de l'ajax)
      logoutCallback: function (context, next) {
        // on vire le user en session et on appelle next, avec une éventuelle erreur en cas de pb
        let error
        if (context.session.user) context.session.user = null
        else error = new Error('Aucun utilisateur connecté')
        next(error)
      },

      // facultatif, timeout d'appel du validate
      timeout: 10
    }
  }
}

/**
 * @typedef {Object} AuthServerDef
 * @property {string} baseUrl url absolue avec / de fin
 * @property {string} [prefix=sesalabSso] Chemin dédié aux routes du module sesalabSso
 * @property {string} loginPage url du form d'authentification
 * @property {string} logoutPage page qui fera toutes les déconnexions en ajax et affichera le résultat
 * @property {string} errorPage page qui affichera une erreur
 * @property {string|RegExp|function} [ip] ip qui répond au validate
 *                                      peut être une ip (v4 ou v6)
 *                                      ou une RegExp
 *                                      ou une fct (qui doit renvoyer un booléen en reçevant une ip)
 */

/**
 * @typedef {Object} ClientDef
 * @property {string} baseUrl url absolue avec / de fin
 * @property {string} [prefix=sesalabSso] Chemin dédié aux routes du module sesalabSso
 * @property {string|RegExp|function} [ip] ip qui appellera le validate
 *                                      peut être une ip (v4 ou v6)
 *                                      ou une RegExp
 *                                      ou une fct (qui doit renvoyer un booléen en reçevant une ip)
 */

/**
 * La configuration à passer au composant
 * @typedef {Object} sesalabSsoConfigDef
 * @property {number} [timeout=10] Timeout des appels du validate (en s), pour un usage client
 * @property {string} [prefix=sesalabSso] Préfixe des routes de ce module (client et serveur)
 * @property {ClientDef[]} clients La liste des applis clientes (donc on est serveur)
 * @property {string} afterClientsPage Page vers laquelle rediriger une fois connecté chez tous les clients (serveur)
 * @property {string} errorPage Page d'affichage d'erreur (serveur)
 * @property {string} loginPage Page du formulaire de login (serveur)
 * @property {string} logoutPage Page qui fera les appels ajax de déconnexion chez tous les clients (serveur)
 * @property {AuthServerDef[]} authServers La liste des serveurs d'authentification (donc on est client)
 * @property {function} loginCallback Logue un user localement (client),
 *                                    appelée avec (context, user, next), doit rappeler next(errror)
 * @property {function} logoutCallback Déconnecte le user courant (client), appelée avec (context, next), doit rappeler next(errror)
 */