如何配置Sequelize的db.config以支持Azure AD服务主体认证?
修改Sequelize配置适配Azure AD服务主体认证
1. 先换配置文件格式
把原来的db.config.json改成db.config.js——毕竟JSON没法写异步逻辑,JS文件才能实现动态获取token的功能。
2. 把服务主体token逻辑集成进去
在新的db.config.js里,加入你之前实现的服务主体获取token的逻辑,然后把token作为认证凭证传给Sequelize。直接用下面的示例代码改就行:
const { AuthenticationContext } = require('adal-node'); require('dotenv').config(); // 从环境变量读服务主体信息 const tenantId = process.env.AZURE_TENANT_ID; const clientId = process.env.AZURE_CLIENT_ID; const clientSecret = process.env.AZURE_CLIENT_SECRET; const resource = 'https://database.windows.net/'; // SQL Server固定资源ID // 获取access token的异步函数 async function getAccessToken() { return new Promise((resolve, reject) => { const context = new AuthenticationContext(`https://login.microsoftonline.com/${tenantId}`); context.acquireTokenWithClientCredentials( resource, clientId, clientSecret, (err, tokenResponse) => { if (err) { reject(err); return; } resolve(tokenResponse.accessToken); } ); }); } // 导出动态配置,自动处理token刷新 module.exports = { development: { database: process.env.DB_DATABASE, host: process.env.DB_HOST, dialect: 'mssql', logging: false, dialectOptions: { authentication: { type: 'azure-active-directory-service-principal', options: { // Sequelize会在需要连接时自动调用这个函数拿最新token getAccessToken: async () => { try { return await getAccessToken(); } catch (err) { throw new Error(`获取Azure AD token失败: ${err.message}`); } } } }, options: { encrypt: true // Azure SQL必须开加密连接 } } } };
3. 补全环境变量
在.env文件里加几个服务主体相关的变量:
AZURE_TENANT_ID=你的租户ID AZURE_CLIENT_ID=你的服务主体客户端ID AZURE_CLIENT_SECRET=你的服务主体客户端密钥
4. 调整Sequelize迁移的配置路径
如果有.sequelizerc文件,把配置路径改成新的db.config.js:
const path = require('path'); module.exports = { config: path.resolve('config', 'db.config.js'), // 其他迁移相关配置保持不变 };
注意点:
- 必须指定认证类型为
azure-active-directory-service-principal,这是mssql dialect专门支持的Azure AD认证方式 getAccessToken函数会自动在需要时刷新token,不用手动处理过期问题- Azure SQL强制要求加密连接,所以
encrypt: true不能省
内容的提问来源于stack exchange,提问作者vijay vijju
相关产品推荐
相关产品推荐

