Komfortable Authentifizierung für dox42 in SharePoint

Um dox42 in SharePoint zu integrieren – zum Beispiel in Form eines Buttons auf einer SharePoint-Seite zum generieren von Dokumenten – muss man ein wenig JavaScript-Code auf der jeweiligen Seite einfügen.

Die Voraussetzungen dafür sind in der Dokumentation zur Integration von dox42 in das Azure Active-Directory beschrieben. Dort gibt es auch ein JavaScript-Interface, welches man verwenden kann um den Aufruf von dox42 (Online) durchzuführen.

Die Herausforderung

Wenn man nun zum ersten mal ein Dokument über den dox42-Server generieren will, so muss man sich am AAD anmelden, um ein entsprechendes Token zu bekommen, mit dem man sich am dox42 Server authentifizieren kann. Dazu wird man auf die Anmelde-Seite vom AAD umgeleitet und anschließend gelangt man wieder zurück auf seine SharePoint Seite.

Aus Sicht der Benutzers ist das ein wenig unschön, da ich meinen SharePoint-Kontext verlasse und ggf. Änderungen auf meiner SharePoint-Seite (wie zB. Filter oder ähnlich) verloren gehen.

Typischerweise erfolgt diese Anmeldung direkt beim Aufruf der Seite, aber wenn man eine solche Seite lange offen hat kann es passieren dass die Tokens ablaufen und dass man beim Anklicken des Buttons (für die Generierung eines Dokuments) zunächst auf die Login-Seite vom AAD umgeleitet wird. Anschließend gelangt man zwar wieder auf die entsprechende SharePoint-Seite, muss aber den Button noch einmal anklicken.

Die Optimierung

Anstatt also für die Anmeldung am AAD auf die entsprechende Login-Seite umzuleiten ist es besser die Anmeldung in einem (separaten) Popup durchzuführen. Dazu muss in der ADAL-Konfiguration das entsprechend angegeben werden (Zeile 12):

window.adalConfig = {
    instance: 'https://login.microsoftonline.com/',
    tenant: '<guid>',    // your Azure Tenant ID here
    clientId: '<guid>',    // your dox42 Server App ID here

    endpoints: {
        endPointApiUri: 'https://<mandant>.dox42.online'  // your dox42 Server URL here
    },

    cacheLocation: 'sessionStorage',    // Could use localStorage as well, but that creates troubles due to expiring cookies

    popUp: true
};

ss

Anschließend wird der Aufruf zum Abrufen des Token über den AuthenticationContext geändert, so dass auch hier ein Popup verwendet wird. Anstatt

authContext.acquireToken(clientId, function (error, token) {
    if (error || !token) {
        reportStatus("Could not aquire AAD Authentication Token, error occurred: " + error);
        return;
    }
    else {
        return token;
    }
});

wird also

authContext.acquireTokenPopup(clientId, null, null, function (error, token) {
    if (error || !token) {
        reportStatus("Could not aquire AAD Authentication Token, error occurred: " + error);        return;
    }
    else {
        return token;
    }
});

aufgerufen. Da die Authentifizierung nun keinen Reload der Seite mehr verursacht, kann die Auswertung des Callbacks entfallen. Somit kann der komplette Eventlistener entfernt werden. Stattdessen wird ein Callback am AuthenticationContext registriert, welcher aufgerufen wird nachdem eine Authentifizierung (via Popup) erfolgt ist.

var authContext = new AuthenticationContext(config);
authContext.callback = function (errorData, token, errorMsg) {
    if (token)
        dox42REST(<myDox42ServerUrl>);
};

var user = authContext.getCachedUser();
if (!user) {
    reportStatus('Logging you in...');
    authContext.login();
} else
    dox42REST(<myDox42ServerUrl>);

Ist der Benutzer also bereits beim AAD angemeldet, so wird direkt die Funktion dox42REST aufgerufen, ansonsten wird zunächst der Login am AuthenticationContext veranlasst und über den Callback wird dann nach erfolgreicher Anmeldung die Funktion dox42REST aufgerufen.

Nach oben scrollen