【问题标题】:Refresh access token for Service Principal authentication using 'ms-rest-nodeauth'使用“ms-rest-nodeauth”刷新服务主体身份验证的访问令牌
【发布时间】:2021-02-23 16:44:01
【问题描述】:

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

有没有办法“刷新”令牌,或者有什么优雅的方式来处理获取新令牌?

【问题讨论】:

    标签: node.js azure azure-active-directory sequelize.js service-principal


    【解决方案1】:

    发布我最终用于解决方案的内容。

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

    【讨论】:

      【解决方案2】:

      您能否尝试将Silent flow 与MSAL.js 结合使用,后者在需要时在内部使用刷新令牌来获取新令牌? 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)
          }
      });
      

      【讨论】:

      • 但这能让我使用服务主体客户端 ID 和密码进行身份验证吗?
      • 不,它需要一个登录用户。如果您仍然想获取带有客户端 ID 和密码的新令牌,则只能在令牌过期后再次获取令牌。因为client credential flow不支持refresh-token。
      猜你喜欢
      • 1970-01-01
      • 2020-02-16
      • 2019-02-27
      • 2019-11-29
      • 1970-01-01
      • 2021-09-17
      • 2021-06-10
      • 2017-11-08
      • 2020-08-05
      相关资源
      最近更新 更多