Skip to content

Latest commit

 

History

History
173 lines (136 loc) · 7.17 KB

Silent.md

File metadata and controls

173 lines (136 loc) · 7.17 KB

Pour cette méthode d'authentification, nous allons essentiellement utiliser la librairie MSAL.js v2 pour navigateur

Lorsque la page /Silent/tabsilentauthenticationstart.html se charge elle déclenche la méthode MSALLoginPopup()

tabsilentauthenticationstart.html

function MSALLoginPopup() {
    microsoftTeams.initialize(window);
    microsoftTeams.getContext(function (context) {
    var MSALApp = new msal.PublicClientApplication(msalConfig)
    
    var currentAccount = MSALApp.getAccountByUsername(context.upn);
    const silentRequest = {
        scopes: ["User.Read", "Mail.Read"],
        account: currentAccount,
        forceRefresh: false
    };
    const request = {
        scopes: ["User.Read", "Mail.Read"],
        loginHint: context.upn
    };    
    MSALApp.acquireTokenSilent(silentRequest).then(tokenResponse => {
        $('#AccessToken').text(tokenResponse.accessToken);
    }).catch(async (error) => {
        $('#Error').text(error);
        if (context.hostClientType === 'web') {
            MSALApp.acquireTokenPopup(request).then(tokenResponse => {
                $('#Error').text("");
                $('#AccessToken').text(tokenResponse.accessToken);
            });
        }
        else {      
            MSALPopupRedirect(MSALApp);
        }
    }).catch(error => {
        $('#Error').text(error);
            });

        });
    }

Tout d'abord on instancie la class msal.PublicClientApplication() en lui passant les paramètres Azure Active Directory définis de la manière suivante.

const msalConfig = {
auth: {
    clientId: "[CLIENT ID]",
    authority: "https://login.microsoftonline.com/common", 
    redirectUri: window.location.origin + "/Silent/tabsilentauthenticationend.html"        
},
cache: {
    cacheLocation: "localStorage", 
    storeAuthStateInCookie: false, 
},
Paramètres Description
clientId Id de l'application enregistrée sur Azure Active Directory. Pour l'inscription d'une application sur Azure Active Directory se référrer à l'article Inscription d'une application SPA
authority Point d'entré Azure Active Directory
redirectUri Url qui sera rappelée par Azure Active Directory. Il est important que lors de l'enregistrement de l'application sur Azure Active Directory de bien la mentionner. Pour l'inscription d'une application sur Azure Active Directory se référrer à l'article Inscription d'une application SPA

Si l'utilisateur est déjà connecté on récupère son compte pour l'utiliser dans la demande silencieuse du jeton.

    var currentAccount = MSALApp.getAccountByUsername(context.upn)S
    const silentRequest = {
         scopes: ["User.Read", "Mail.Read"],
         account: currentAccount,
         forceRefresh: false
     };

Ensuite on va essayer d'obtenir un jeton de manière silencieuse et l'afficher.

    MSALApp.acquireTokenSilent(silentRequest).then(tokenResponse => {
                $('#AccessToken').text(tokenResponse.accessToken);

Si c'est la 1ere fois que l'utilisateur utilise l'application, la méthode échoue et on déclenche la méthode MSALApp.acquireTokenPopup().

C'est alors que l'on demande à l'utilisateur de s'authentifier et d'approuver les consentements.

consent

Vous aurez noté, qu'il est possible de récupèrer le context Microsoft Teams dans lequel tourne l'application. microsoftTeams.getContext(function (context).

L'objet context expose la propriété .hostClientType qui sera alors possible de tester pour savoir si l'application tourne dans la version Web du client Teams ou tout autre client.

Comme la méthode acquiereTokenPopup() ne fonctionne pas "encore" sur les clients Teams de bureau et mobile, nous invoquons une autre méthode MSALPopupRedirect() pour l'authentification.

function MSALPopupRedirect(msalapp) {    
    microsoftTeams.authentication.authenticate({
        url: window.location.origin + "/Popup/authPopupRedirect.html",
        width: 1024,
        height: 1024,
        successCallback: (result) => {
            $('#Error').text("");
            $('#AccessToken').text(result.accessToken);
            
        },
        failureCallback: (reason) => {
            $('#Error').text(reason);
        }
        });
}

La méthode microsoftTeams.authentication.authenticate() va permettre de charger la page authPopupRedirect.html dans une Popup.

En fonction de la réussite ou de l'échec de l'authentification, on affiche le jeton ou l'erreur. Lorsque la page authPopupRedirect se charge elle exécute le code suivant :

authPopupRedirect.html

 $(document).ready(function () {
   microsoftTeams.initialize(window);
   const msalPopupConfig = {
       auth: {
           clientId: msalConfig.auth.clientId,
           authority: msalConfig.auth.authority,
           redirectUri: window.location.origin + "/Popup/authPopupRedirect.html"
       },
       cache: {
           cacheLocation: "sessionStorage", 
           storeAuthStateInCookie: false, 
       }
   };
   const msalClient = new msal.PublicClientApplication(msalPopupConfig);
   microsoftTeams.getContext((context) => {
       msalClient.handleRedirectPromise().then((tokenResponse) => {
           if (tokenResponse) {
               microsoftTeams.authentication.notifySuccess(tokenResponse);
           }
       }).catch((error) => {
           console.log(error);
           microsoftTeams.authentication.notifyFailure(error);
       });
       
       msalClient.loginRedirect({
           scopes: ["User.Read", "Mail.Read"],
           loginHint: context.loginHint
       });
   });
        });

Ici c'est la méthode msaClient.LoginRedirect() qui affichera la page d'authentification et de consentement à l'utilisateur.

Si une erreur survient, la méthode microsoftTeams.authentication.notifyFailure(error) est invoquée et renvoie l'erreur à la page /Silent/tabsilentauthenticationstart.html qui sera traitée par la méthode failureCallback

Si la demande de jeton réussie, la méthode microsoftTeams.authentication.notifySuccess(tokenResponse) est invoquée et renvoie le résultat à la page /Silent/tabsilentauthenticationstart.html qui sera traité par la méthode successCallback

Note : Je dois encore corriger quelques bugs lors de l'utilisation de cette exemple dans les clients teams de bureau et Mobile, stay tune !!

Si l'authenfication réussie, vous devriez obtenir le jeton d'accès comme illustré sur la figure suivante :

Token

Autres méthodes d'authentification

Authentification dans les onglets

Authentification SSO