Source: auth/controllerAuth.js


'use strict'

const displayError = require('../ressource/displayError')

/**
 * Controleur pour gérer l'authentification
 * @controller controllerAuth
 * @extends Controller
 */
module.exports = function (component) {
  component.controller(function ($auth, $accessControl) {
    function redirectOrError (context) {
      context.layout = 'page'
      if (context.get.redirect) context.redirect(context.get.redirect)
      else displayError(context, 'Utilisateur déjà connecté')
    }

    const controller = this

    // on diffère la création des routes à l'ajout du premier client
    $auth.deferController(function () {
      /**
       * connexion, redirige vers le serveur d'authentification par défaut ou précisé par ?source=xxx
       * @route GET /connexion
       */
      controller.get('connexion', function (context) {
        if ($accessControl.isAuthenticated(context)) {
          redirectOrError(context)
        } else {
          $auth.login(context)
        }
      })

      /**
       * Déconnexion ici (action de l'utilisateur sur ce site),
       * et redirection vers la déconnexion du serveur sso (qui rappellera son client ici)
       * On est juste là en fallBack, normalement le lien de déconnexion pointe directement sur
       * l'url de déconnexion de notre serveur d'authentification (ou ici si on l'a pas trouvé,
       * pour au moins déconnecter localement)
       * @route GET /deconnexion
       */
      controller.get('deconnexion', function (context) {
        if ($accessControl.isAuthenticated(context)) {
          $auth.logout(context)
        } else {
          context.layout = 'page'
          displayError(context, 'Utilisateur déjà déconnecté (ou jamais connecté)')
        }
      })

      /**
       * Valide un retour du serveur d'authentification (qui peut répondre que l'on est pas connecté)
       * @route GET /validation
       */
      controller.get('validation', function (context) {
        if ($accessControl.isAuthenticated(context)) return redirectOrError(context)
        $auth.validate(context, function (error) {
          if (error) return displayError(context, error)
          const uri = context.get.redirect || '/'
          context.redirect(uri)
        })
      })

      /**
       * Controleur sur toutes les routes html pour peupler le authBloc (faut passer après les contrôleurs html),
       * @route GET /*
       */
      controller.get('*', function (context) {
        // si on est pas concerné on passe au suivant sans rien faire
        if (context.layout !== 'page') return context.next()
        const data = {
          authBloc: $auth.getAuthBloc(context)
        }
        data.authBloc.$view = 'auth'
        context.next(null, data)
      })
    }) // deferController
  })
}