Обновить токен доступа для аутентификации субъекта-службы с помощью ms-rest-nodeauth

У меня есть приложение, которому необходимо подключиться к Azure SQL Server и которое использует Sequelize в качестве ORM. Я пытаюсь сделать решение более безопасным, аутентифицируя его с помощью субъекта-службы. Я использую модуль @ azure / ms-rest-nodeauth для получения токена доступа и передачи его в Sequelize в моем инициализаторе БД. Функция loginWithServicePrincipalSecret получает токен доступа, передавая учетные данные SPN.

const sequelize = new Sequelize({
      database: AZURE_SQL_DB,
      host: AZURE_SQL_SERVER,
      dialect: 'mssql',
      logging: true,
      dialectOptions: {
        authentication: {
          type: 'azure-active-directory-access-token',
          options: {
            token: accessToken,
          },
        }
      }
    })

Проблема в том, что, хотя это работает для установления соединения, срок действия токенов доступа истекает через 1 час. Это нарушит работу решения, поскольку оно продолжает прослушивать новые запросы, и срок действия токена истечет.

Есть ли способ «обновить» токен или, может быть, какой-нибудь элегантный способ справиться с получением нового токена?


person yohaansunnie    schedule 23.02.2021    source источник


Ответы (2)


Не могли бы вы попробовать использовать Тихий поток с MSAL.js, который внутренне использует токен обновления для получения новых токенов по мере необходимости? _ 1_ (@ azure / msal-node) может выполнять автоматическое обновление токенов, что означает, что вам не нужно получать токен обновления самостоятельно.

var request = {
    scopes: ["Mail.Read"]
};

msalInstance.acquireTokenSilent(request).then(tokenResponse => {
    // Do something with the tokenResponse
}).catch(error => {
    if (error instanceof InteractionRequiredAuthError) {
        // fallback to interaction when silent call fails
        return myMSALObj.acquireTokenRedirect(request)
    }
});
person Pamela Peng    schedule 24.02.2021
comment
Но позволит ли это мне аутентифицироваться с использованием идентификатора и секрета клиента-принципала службы? - person yohaansunnie; 24.02.2021
comment
Нет, нужен авторизованный пользователь. Если вы все еще хотите получить новый токен с идентификатором клиента и секретом, вы можете получить токен снова только после истечения срока действия токена. Поскольку поток учетных данных клиента не поддерживает refresh-token. - person Pamela Peng; 24.02.2021

Публикация того, что я использовал для своего решения.

Tedious поддерживает тип аутентификации «azure-active-directory-service-Principal-secret», который в фоновом режиме использует методы @ azure / ms-rest-nodeauth и обрабатывает аутентификацию.

{
  database: AZURE_SQL_DB,
  host: AZURE_SQL_SERVER,
  dialect: 'mssql',
  logging: true,
  dialectOptions: {
    authentication: {
      type: 'azure-active-directory-service-principal-secret',
      options: {
        clientId: AZURE_CLIENT_ID,
        tenantId: AZURE_TENANT_ID,
        clientSecret: AZURE_CLIENT_SECRET,
      },
    },
  },
};
person yohaansunnie    schedule 31.03.2021