Skip to content
On this page

Authentification tribuo.cloud

Il y a deux composantes principales à l'authentification sur l'api : La vérification d'identité et l'accès aux ressources de l'API.

Accès aux routes de l'API

L'API tribuo.cloud est une api REST. Ainsi, chaque requête peut être soumise à une authentification plus ou moins limités. Pour vérifier l'identité et les permissions de l'utilisateur, on utilise une clé avec le préfixe KEY dans le header Authorization (l'espace entre KEY et la clé doit être respécté).



 



axios.get('https://api.tribuo.cloud/testDb', {
    headers: {
        'Authorization':  'KEY 23jfki3782dy7ed8e10878gdsho390'
    }
})

De cette façon l'API reconnait l'utilisateur et les droits accordés. De façon générale un site ouvert aux utilisateurs va posséder une clé unique ne servant qu'à récupérer les informations dont il à besoin pour fonctionner, et au contraire les personnes physique possèdent des clés 'admin' pouvant accéder à toutes les routes pour faciliter le development.

ATTENTION

Attention, chaque clé possède un accés restreint aux routes de l'API. Il faut faire attention à utiliser la bonne clé pour chaque tache, notamment si elle est utilisé en front.

Vérification d'identité

Afin de protéger l'accès à certaines ressources comme cette documentation par exemple, il existe un système en place pour vérifier l'identité des visiteurs. Cela passe par l'utilisation de login.tribuo.cloud qui permet d'obtenir un token vérifié de connexion, avec les informations de l'utilisateur. L'utilisateur à alors le choix de la méthode de connexion pour s'authentifier.

Demander un token

Pour cela il faut rediriger l'utilisateur sur login.tribuo.cloud avec un paramètre 'origin' dans l'URL indiquant là où l'on veut renvoyer le token.

// Dans cet exemple on demande à renvoyer le token sur le site docs.tribuo.cloud
window.location.replace(`https://login.tribuo.cloud?origin=docs.tribuo.cloud`)

ATTENTION

Sans le paramètre origin, n'ayant nulle part ou renvoyer le token le site login affichera une erreur à l'utilisateur.

ASTUCE

En développement local, on peut mettre son url localhost pour tester le système de login et être redirigé vers son serveur local.

Le processus d'authentification

Le processus d'authentification ressemble à un SSO. Il a comme principe d'intégrer plusieurs méthodes de connexion existante de l'entreprise que les employés utilise déjà afin d'éviter là sur-création de compte utilisateur.

Pour le moment, uniquement la connexion avec un compte Zoho est en place, mais Zoho étant la base du système d'information de l'entreprise cela permet déjà d'authentifier tous les utilisateurs de tribuo.

Voici à quoi ressemble le processus de connexion schématisé :

LES ÉTAPES :
  1. On redirige vers le site de login en précisant l'URL d'origin
  2. Le site login redirige vers l'API sur une route de login en fonction de la méthode choisi (ex: https://api.tribuo.cloud/auth/login-zoho)
  3. L'API redirige l'utilisateur vers le SSO choisi avec les informations nécessaire
  4. Le SSO choisi redirige vers l'API sur une route pour créer un token avec les nouvelles informations (ex: https://api.tribuo.cloud/auth/new-token)
  5. L'API génère et signe un token JWT qui contient les informations de l'utilisateur connecté.
  6. L'API renvoie le token à l'URL d'origine via un paramètre d'URL
  7. Le site vérifie la validité du token grâce à une route (ex: https://api.tribuo.cloud/auth/check-token/:token)

Récupérer le token

Une fois le processus de connexion réaliser par l'utilisateur, ce dernier sera redirigé sur l'URL donné dans le paramètre origin fourni à l'étape précédente, avec un paramètre token.

'https://docs.tribuo.cloud?token=90h2to4hbgfuih4287y328udpo9jhfig4h89yf23h'

Il est alors possible de récupérer le token dans l'URL, et de l'utiliser pour authentifier l'utilisateur.

En parsant le token JWT on peut récupérer les informations de l'utilisateur sous cette forme :

{
  "name": "Elliot Thiebaut",
  "id": "146098000645190267",
  "email": "elliot.thiebaut@tribuo.fr",
  "img_url": "https://contacts.zoho.eu/file?t=user&ID=20078284501&fs=thumb",
  "role": "admin",
  "company": "tribuo",
  "iat": 1657209641,
  "exp": 1658419241
}

ATTENTION

Il ne faut jamais faire confiance à l'utilisateur et toujours vérifier le token récupéré dans l'URL

Vérification du token

Dans le processus, il faut toujours vérifier la validité du token reçu.

Pour cela il existe une route dans l'API :

// Il faut mettre le token recu dans le paramètre 'token' de l'url

axios.get('https://api.tribuo.cloud/check-token/:token')

Si le token à bien été signé par l'API tribuo.cloud, celle ci renvoie une réponse 200 et l'on peut considérer l'utilisateur comme authentifié !

Exemple sur un site Vue JS

Pour démontrer comment on peut demander, recevoir et stoker le token, voici un snippet qui à été fait pour être utilisé dans un site VueJS, dans la méthode created() de App.vue.

const originUrl = 'docs.tribuo.cloud'

    // Fonction de vérification du cookie
    const checkCookie = async (token) => {
      try {
        // On utilise la route dédié à la vérification de token via l'api
        const responseCookie = await axios.get(`https://api.tribuo.cloud/auth/check-token/${token}`)
        
        // On peut vérifier de façon optionel le user pour controler l'accés
        if (user.company !== 'tribuo' && user.role !== 'default') window.location.replace(`https://login.tribuo.cloud?origin=${originUrl}&error=permission`)  
        
        // On indique que l'utilisateur est connecté et on enregistre le cookie 
        this.isConnected = true
        document.cookie = `tribuo_cloud_token=${token};max-age=172800`
          
        // On néttoie l'url en supprimant le token
        if (urlParams.has('token')) {
          window.history.replaceState({}, '', '/')
        }
      } catch (e) {
        // Si le token n'est pas valide, on redirige vers login.tribuo.cloud
        window.location.replace(`https://login.tribuo.cloud?origin=${originUrl}&error=expired`)
      }
    }

    // On récupère les information dans l'URL et le cookie
    const queryString = window.location.search;
    const urlParams = new URLSearchParams(queryString);
    let cookieToken = (document.cookie.match(/^(?:.*;)?\s*tribuo_cloud_token\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]

    // On fait vérifier le token et on revoit vers la page de login si il y en a pas
    if (urlParams.has('token')) {
      checkCookie(urlParams.get('token'))
    } else if (cookieToken !== null) {
      checkCookie(cookieToken)
    } else {
      window.location.replace(`https://login.tribuo.cloud?origin=${originUrl}`)
    }

Docs tribuo.cloud