Вызов API Graphi из классического JavaScript через msal.js - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь сделать тихий вход в систему через msal.js, а затем пытаюсь вызвать graph api, но всегда получаю ошибку 403. Когда я расшифровываю свой токен доступа через jwt.ms, я вижу, что аудитория верна, но области видимости отображаются неправильно. Надеюсь, что некоторые могут помочь мне.

Мой код

let config = {
    auth: {
      clientId: _spPageContextInfo.spfx3rdPartyServicePrincipalId,
      authority: `https://login.microsoftonline.com/${_spPageContextInfo.aadTenantId}`,
      redirectUri: 'https://xxx.sharepoint.com/sites/xxx-Dev/Pages/myportal.aspx',
      validateAuthority: false,
      postLogoutRedirectUri: window.origin,
    },
    cache: {
      cacheLocation: 'localStorage',
      storeAuthStateInCookie: true
    }
  }

  let myMSALObj = new Msal.UserAgentApplication(config)
  let graphConfig = {
    graphGroupEndpoint: "https://graph.microsoft.com/v1.0/groups"
  }

  let request = {
    scopes: ["https://graph.microsoft.com/.default"]
  }


  myMSALObj.handleRedirectCallback(response => { console.log(response) });
  //const idTokenScope = { scopes: [_spPageContextInfo.spfx3rdPartyServicePrincipalId] }

  const handleError = (error) => {
    if (error.errorCode === 'consent_required'
      || error.errorCode === 'interaction_required'
      || error.errorCode === 'login_required') {
      //myMSALObj.loginRedirect(idTokenScope);
      myMSALObj.loginRedirect(request);
      return;
    }
    throw error;
  };

  const getToken = () => {
    const date = new Date();
    const user = myMSALObj.getAccount();
    if (!user) {
      //myMSALObj.loginRedirect(idTokenScope);
      myMSALObj.loginRedirect(request);
      return;
    }
    //myMSALObj.acquireTokenSilent(idTokenScope).then(response => {
    myMSALObj.acquireTokenSilent(request).then(response => {
      console.log(`${date.toLocaleTimeString()}`, response.accessToken);
      callMSGraph(graphConfig.graphGroupEndpoint, response.accessToken, graphAPICallback)
    }).catch(handleError);
  }
  getToken()

  function callMSGraph(theUrl, accessToken, callback) {
    var xmlHttp = new XMLHttpRequest()
    xmlHttp.onreadystatechange = function () {
      if (this.readyState == 4 && this.status == 200)
        callback(JSON.parse(this.responseText))
    }
    xmlHttp.open("GET", theUrl, true)
    xmlHttp.setRequestHeader('Authorization', 'Bearer ' + accessToken)
    xmlHttp.send()
  }
  function graphAPICallback(data) {
    document.write(JSON.stringify(data, null, 2))
  }

Мой расшифрованный токен enter image description here

Разрешение моего приложения enter image description here

1 Ответ

1 голос
/ 13 октября 2019

Существует два вида разрешений: один - разрешение приложения, другой - делегированное разрешение. И "https://graph.microsoft.com/.default" предназначен для применения разрешений.

enter image description here

При интерактивной подписи из браузера вам будет предложено предоставить свои учетные данные. Таким образом, вы получите для себя токен доступа с делегированными разрешениями. Мы называем это потоком кода авторизации OAuth 2.0

Однако, поскольку вы не задаете никаких необходимых делегированных разрешений в своей области запросов, Azure AD просто возвращает вам маркер доступа с базовыми делегированными разрешениями (openid, напишите профиль).


Кстати, если вы просто хотите получить токен доступа с разрешениями приложения. Вам просто нужно использовать поток учетных данных клиента OAuth 2.0 , чтобы получить токен.

...