具有 Azure 托管身份的 Express.js 无法在访问令牌过期后刷新

问题描述 投票:0回答:1

我有一个 Express.js 应用程序,它使用托管标识连接到 Azure MYSQL DB。 server.js 文件导入并调用 setupConnectionPool 函数,成功获取访问令牌并连接到数据库。但是,24 小时后令牌就会过期,并且到目前为止我刷新令牌的解决方案都不起作用。

我尝试执行 setInterval 和 setTimeout 在到期时重新调用 setupConnectionPool ,还尝试了 if(accessToken.expiresOnTimestamp < Date.now()), but no success. Last piece of a client project I need resolved, appreciate any ideas!

const mssql = require('mssql');
require('dotenv').config();
const { DefaultAzureCredential } = require("@azure/identity");

async function setupConnectionPool() {
    try {
      console.log(process.env.AZURE_DEV_MI_CLIENT_ID)
      const credential = new DefaultAzureCredential({
        managedIdentityClientId: process.env.AZURE_DEV_MI_CLIENT_ID,
      });
      console.log('credentialll', credential)
      let accessToken = await credential.getToken("https://database.windows.net/.default");
      console.log('access token', accessToken)

      const refreshTime = accessToken.expiresOnTimestamp - Date.now();
      console.log('refreshTime', refreshTime)
      const refreshToken = async () => {
        if(pool) {
          console.log('close pool')
          await pool.close();
        }
        console.log('refresh token func call')
        try {
          console.log('try setupconnectionpool')
          await setupConnectionPool();
        } catch(e) {
          console.log('catch e', e)
        }
      }

      setTimeout(() => {
        console.log('Get refresh token - 10000');
        refreshToken();
      }, (refreshTime - 10000))

      const config = {
        user: "",
        password: "",
        server: process.env.DB_SERVER,
        authentication: {
          type: "azure-active-directory-access-token",
          options: {
            token: accessToken.token,
          },
        },
        options: {
          database: process.env.DB_NAME,
          encrypt: true,
          port: 1433,
        },
      };
      const pool = new mssql.ConnectionPool(config);
      await pool.connect();
      console.log('pool', pool);
      return pool;
    } catch (error) {
      console.error("Error setting up connection pool:", error);
      throw error;
    }
}

module.exports = { setupConnectionPool }
azure express access-token azure-managed-identity
1个回答
0
投票
  • 根据 Microsoft identity 中关于刷新令牌的文档,当客户端获得访问令牌来访问受保护资源时,它也会收到刷新令牌。此刷新令牌用于在当前访问令牌过期时获取新的访问令牌。

  • 与访问令牌相比,刷新令牌的生命周期更长。单页应用程序的默认生命周期为 24 小时,其他场景的默认生命周期为 90 天。每次使用刷新令牌时,它都会用新令牌替换自身。

console.log(process.env.AZURE_DEV_MI_CLIENT_ID)
      const credential = new DefaultAzureCredential({
        managedIdentityClientId: process.env.AZURE_DEV_MI_CLIENT_ID,
      });
      console.log('credentialll', credential)
      let accessToken = await credential.getToken("https://database.windows.net/.default");
      console.log('access token', accessToken)

输出:

enter image description here

  • 刷新令牌可能因超时、撤销或其他因素而随时被撤销。由于凭证、用户操作、管理操作或单点注销事件的更改,可能会发生撤销。

  • 如果刷新令牌发送到注册为单页应用程序的重定向 URI,则该令牌将在 24 小时后过期。应用程序必须准备好重新运行授权代码流程,以便每 24 小时获取一个新的刷新令牌。

  • 刷新令牌的生命周期无法配置。因此,无需使用 setInterval 和 setTimeout,但可以通过条件访问策略来管理登录频率,以定义用户何时需要再次登录

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.