我有一个 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 }
根据 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)
输出:
刷新令牌可能因超时、撤销或其他因素而随时被撤销。由于凭证、用户操作、管理操作或单点注销事件的更改,可能会发生撤销。
如果刷新令牌发送到注册为单页应用程序的重定向 URI,则该令牌将在 24 小时后过期。应用程序必须准备好重新运行授权代码流程,以便每 24 小时获取一个新的刷新令牌。
刷新令牌的生命周期无法配置。因此,无需使用 setInterval 和 setTimeout,但可以通过条件访问策略来管理登录频率,以定义用户何时需要再次登录。