Как я могу получить refre sh токен с графика Microsoft - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь создать инструмент автоматизации электронной почты Outlook. Для этого нужно сделать что-то, например, отправить электронное письмо в папку для пользователя в указанное время. Microsoft позволяет сторонним apis запускать apis от имени пользователя от имени пользователя через auth2. Я могу получить необходимый токен доступа, но мне нужен токен refre sh, чтобы вызывать код от имени пользователя, не заставляя его входить в систему каждый час.

В настоящее время я использую библиотеку аутентификации Microsoft javascript для получения токенов. Из того, что я прочитал, кажется, что у refre sh должна быть автономная область действия в запросе токена. С кодом ниже, я могу получить ответ с токеном доступа, но я все еще не могу получить токен доступа.

enter image description here

const tokenRequest = {
  scopes: [
    "https://graph.microsoft.com/Mail.ReadWrite",
    "https://graph.microsoft.com/mail.send",
    "https://graph.microsoft.com/offline_access"
  ]
};

const hostname = "http://localhost:5000";

const backendServerAdress = "http://localhost:8050";
var xhr = new XMLHttpRequest();
xhr.open("POST", backendServerAdress, true);
xhr.setRequestHeader("Content-Type", "application/json");

const msalConfig = {
  auth: {
    clientId: "something",
    redirectUri: hostname + "/homepage/index.html"
  }
};

var loginRequest = {
  scopes: ["Mail.ReadWrite", "mail.send", "offline_access"] // optional Array<string>
};

const TOKEN_ID = "token_id";
const msalInstance = new Msal.UserAgentApplication(msalConfig);

msalInstance.handleRedirectCallback((error, response) => {
  console.log("redirect callback done");
});

async function redirectToDashboard() {
  console.log("redirect to dashboard");
  // var response = await requestTokenSilent();
  var response;
  if (!response || !response.status == 200) {
    response = await requestTokenPopup();
  }

  if (response && response.status == 200) {
    xhr.send(
      JSON.stringify({
        firstname: "something",
        lastname: "something",
        accessToken: "something"
      })
    );
    location.href = hostname;
  } else {
    console.log("Unable to acquire token");
  }
}

function redirectLogin() {
  console.log("redirect called");
  if (!msalInstance.getAccount()) {
    return msalInstance
      .loginRedirect(loginRequest)
      .then(response => {
        console.log(response);
        return response;
      })
      .catch(err => {
        console.log("Authentication error: ", err);
      });
  }

  if (msalInstance.getAccount()) {
    redirectToDashboard();
  }
}

async function requestTokenSilent() {
  console.log("requestTokenSilent");
  if (msalInstance.getAccount()) {
    return msalInstance
      .acquireTokenSilent(tokenRequest)
      .then(response => {
        localStorage.setItem(TOKEN_ID, response.accessToken);
        console.log("response reached: ", response);
        resolve(response);
      })
      .catch(err => {
        if (err.name === "InteractionRequiredAuthError") {
          alert("Authentication failed try again");
        }
      });
  }
}

async function requestTokenPopup() {
  console.log("requestTokenPopup");
  if (msalInstance.getAccount()) {
    return msalInstance
      .acquireTokenPopup(tokenRequest)
      .then(response => {
        localStorage.setItem(TOKEN_ID, response.accessToken);
        return response;
      })
      .catch(err => {
        console.log(err);
        if (err.name === "InteractionRequiredAuthError") {
          alert("Authentication failed try again");
        }
      });
  }
}

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Я использовал версию v1 msal. Версия V1 больше не поддерживает refre sh токены. Мне сказали, что msal v2 поддерживает refre sh токены, но сейчас он находится в бета-версии.

1 голос
/ 14 апреля 2020

MSAL. js делает неявный поток для получения токенов доступа. Этот поток вообще не возвращает refre sh токенов, поскольку токены refre sh не имеют цели в неявном потоке. Ссылка sh выполняется скрытым запросом. По ссылке выше:

Неявное предоставление не предоставляет refre sh токенов. И id_tokens, и access_tokens истекают через короткий промежуток времени, поэтому ваше приложение должно быть готово периодически обновлять sh этих токенов. Чтобы обновить sh любой тип токена, вы можете выполнить тот же скрытый запрос iframe сверху, используя параметр prompt = none для управления поведением платформы идентификации. Если вы хотите получить новый id_token, обязательно используйте id_token в response_type и scope = openid, а также параметр nonce.

MSAL. js сделает это автоматически, если срок действия текущего токена доступа истекает при вызове requestTokenSilent.

. Требуется токен refre sh, поскольку ваша реальная цель - получить доступ к процессу на бэкэнд-сервере. Неявный не будет работать для этого. Вместо этого вам нужно использовать от имени потока . Здесь вы можете прочитать все подробности, но сводка высокого уровня:

  • Ваш JavaScript интерфейс получает токен через неявный поток с использованием MSAL. js для вашего веб-API бэкенда. Он отправляет этот токен в заголовке Authorization при обращении к вашему бэкэнду.
  • Ваш бэкэнд использует поток от имени для обмена этого токена на токен доступа и refre sh токен для Graph.
0 голосов
/ 12 апреля 2020

Во-первых, я не очень хорош в JavaScript, но мне кажется, что вы не вынимаете refresh_token. Refresh_tokens являются долгоживущими, однако при запросе нового вы должны обновить refresh_token при получении нового access_token, поскольку сервер авторизации МОЖЕТ выдать новый.

Я нашел много помощи в этой статье, когда боролся с этим. Microsoft docs v2-oauth2-auth-code-flow

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...