Цикл по арендаторам с использованием MSAL. js - PullRequest
0 голосов
/ 18 февраля 2020

Я использую MSAL. js для входа в систему и использования Graph API.

Созданное мной приложение Azure AD является мультитенантным и имеет правильные разрешения при работе с определенным арендатором, чтобы я мог подтвердить, что это работает.

Препятствие в том, что я хочу иметь возможность * l 1035 * через всех наших арендаторов для получения любых данных, доступных в API графа.

Я попытался просто изменить конфигурацию соединения MSAL, однако это не удалось и будет использовать существующее значение authority при каждом вызове.

После этого я создал массив forEach с tenantid для этого до l oop, однако это дало тот же результат.

Я создал функцию выхода из системы, которая вызывалась каждый раз, однако она хочет перенаправить вас со своей страницы на адрес выхода из системы.

Мой код:

function config_app(tenantid, callback, apiUrl) {
    var applicationConfig = {
        auth: {
            clientId: "XXXX-XXXX-XXXX-XXXX",
            authority: "https://login.microsoftonline.com/" + tenantid,
            redirectUri: "https://my.redirecturi.com/fake"
        },
        cache: {
            cacheLocation: "sessionStorage",
            storeAuthStateInCookie: false
        }
    };
    var msalInstance = new Msal.UserAgentApplication(applicationConfig);
    callback(tenantid, applicationConfig, msalInstance, callMSGraph, apiUrl);
}
function sign_in(tenantid, applicationConfig, msalInstance, callback, apiUrl) {
    var scopes = {
        scopes: ["Organization.Read.All"],
        loginHint: "my@email.com"
    };
    msalInstance.acquireTokenSilent(scopes).then(response => {
        callback(response.accessToken, graphAPICallback, apiUrl);
    }).catch(err => {
    });
}
function callMSGraph(accessToken, callback, apiUrl) {
    console.log("calling ms graph");
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200)
            callback(JSON.parse(this.responseText));
    }
    xmlHttp.open("GET", "https://graph.microsoft.com/v1.0/" + apiUrl, true);
    xmlHttp.setRequestHeader('Authorization', 'Bearer ' + accessToken);
    xmlHttp.send();
}
function graphAPICallback(data) {
    $('#o365res').append(JSON.stringify(data, null, 2));
}
config_app('XXX-XXX-XXX-XXX-XXX', sign_in, 'organization');

Я попытался добавить несколько идентификаторов арендаторов в массив и l oop, используя:

var clients = ['XXX-XXX-XXX-XXX-XXX','YYYY-YYYY-YYYY-YYYY'];
clients.forEach(function(e) {
    config_app(e, sign_in, 'organization');
});

После длительного чтения кажется, что я не может использовать функцию выхода из системы без перенаправление, я бы предпочел просто изменить арендатора через значение authority и в любом случае перепрыгнуть с тем же токеном.

Я использую MSAL v1.2.0

I ' Я надеюсь вытащить все данные Организации от наших арендаторов для отображения на одной странице, а затем расширить их, чтобы получить безопасные оценки и любые другие ценные данные из API.

Спасибо

1 Ответ

0 голосов
/ 28 февраля 2020

После связи с добрыми разработчиками MSAL. js Я работал над решением.

Проблемы с GitHub:

Моя оригинальная проблема

Они сказали, что это было связано / дубликат этого

Однако я обнаружил, что, упрощая функцию и добавляя forceRefresh: true, к областям действия, каждый проход сумел изменить полномочия и получить необходимые данные. .

Вот мои функции:

function getData(tenantid,apiUrl) {
    return new Promise(resolve => {
        var applicationConfig = {
            auth: {
                clientId: "AZURE-APP-ID-HERE",
                authority: "https://login.microsoftonline.com/" + tenantid,
                redirectUri: "https://my.redirect.uri/uri"
            },
            cache: {
                cacheLocation: "localStorage",
                storeAuthStateInCookie: false
            }
        };
        var msalInstance = new Msal.UserAgentApplication(applicationConfig);
        var scopes = {
            forceRefresh: true,
            scopes: ["Organization.Read.All"],
            loginHint: "user@email.com"
        };
        msalInstance.acquireTokenSilent(scopes).then(response => {
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {
                    var data = JSON.parse(this.responseText);
                    $('#o365res').append(JSON.stringify(data, null, 2));
                    resolve();
                }
            }
            xmlHttp.open("GET", "https://graph.microsoft.com/v1.0/" + apiUrl, true);
            xmlHttp.setRequestHeader('Authorization', 'Bearer ' + response.accessToken);
            xmlHttp.send();
        }).catch(err => { });
    });
}
function getDataChain(clients) {
    const nextClient = clients.shift();
    if (nextClient) {
        return getData(nextClient,'organization').then(_ => getDataChain(clients))
    } else { return Promise.resolve(); }
}

Затем следует мой массив идентификаторов клиентов и вызов функции цепочки:

var clients = ['XXX-XXX-XXX-XXX-XXX','YYY-YYY-YYY-YYY-YYY'];
getDataChain(clients).then(_ => console.log("all finished"));
...