# Authentification (keycloak)

# Description

Plugin d'authentification qui permet d'instancier keycloak dans les SFC.

# Utilisation

Dans main.js et équivalents (ex: enhanceApp.js):

import { UnidooKeycloak } from "@sedoo/unidoo";
Vue.use(UnidooKeycloak, { axios });

NB : UnidooKeycloak a besoin de l'instance axios du projet principal

Dans le composant racine de l'appli :

created() {
  // cette fonction d'initialisation ne doit être appelée qu'une seule fois
  this.$unidooInitKeycloak({
    ssoParams: {
      authorizedDomains: [...],
      clientId: "...",
      onLoad: "check-sso",
      realm: "...",
      resource: "...",
      url: "..."
    }
  });
}

Renseigner les valeurs des paramètres en fonctions des paramètres SSO défini dans la partie admin de Keycloak.

Utilisation basique dans un composant d'authentification via bouton :

<template>
  <v-btn @click="login">login</v-btn>
  <v-btn @click="logout">logout</v-btn>
</template>
    // ...
    data() {
      return {
        localKeycloak: this.$keycloak
      };
    },
    computed: {
      authenticated() {
        return this.localKeycloak.authenticated;
      },
    },
    methods: {
      login() {
        this.$keycloak.login();
      },
      logout() {
        this.$store.dispatch("userSignOut");
        this.$keycloak.logout();
      }
    }

Si on veut récupérer les informations de l'utilisateur connecté :

    // dans le composant d'authentification
    watch: {
      authenticated(value) {
        if (value) {
          this.$store.dispatch("userSignIn", this.$keycloak);
        }
        // si on veut stocker le booléen authenticated dans le store pour l'utiliser à différents endroits de l'application
        this.$store.commit("setAuthenticated", value);
      }
    },

Actions du store :

    // dans le store de l'utilisateur
    actions: {
      async userSignIn({ commit }, keycloak) {
        await initUser(commit, keycloak);
      },
      userSignOutDispatch({ commit }) {
        commit("setUser", null);
        // remettre à null les capabilities de l'user ici si nécessaire
      },
    }
    // ...
  export async function initUser(commit, keyCloak) {
    if (keyCloak.tokenParsed) {
      keyCloak.loadUserProfile().then((userProfile) => {
        const attributes = userProfile.attributes;
        const id = keyCloak.tokenParsed.sub;
        const firstName = keyCloak.tokenParsed.given_name;
        const lastName = keyCloak.tokenParsed.family_name;
        const email = keyCloak.tokenParsed.email;
        const resourceRoles = Object.keys(keyCloak.tokenParsed.resource_access)
          .map((key) => {
            return keyCloak.tokenParsed.resource_access[key].roles;
          })
          .join(",")
          .split(",");

        const realmRoles = keyCloak.tokenParsed.realm_access.roles;
        let roles = [];
        if (realmRoles) {
          roles = roles.concat(realmRoles);
        }
        if (resourceRoles) {
          roles = roles.concat(resourceRoles);
        }

        let user = {
          id,
          email,
          roles,
          firstName,
          lastName,
          attributes
        };
        commit("setUser", user);
      });
    }
  }

# Exemple

NB : regarder l'onglet "Network" des devtools pour vérifier que le token est bien récupéré lorsqu'on est loggué.