使用 'ms-rest-nodeauth' 刷新服务主体身份验证的访问令牌

Refresh access token for Service Principal authentication using 'ms-rest-nodeauth'

我有一个应用程序需要连接到 Azure SQL 服务器并使用 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 小时后过期。这会破坏解决方案,因为它会不断侦听新请求并且令牌会过期。

是否有办法 'refresh' 令牌或一些优雅的方式来处理获取新令牌?

能否请您尝试使用Silent flow with MSAL.js, which internally uses the refresh token to fetch new tokens as and when needed? acquireTokenSilent(@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)
    }
});

发布我最终使用的解决方案。

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,
      },
    },
  },
};