如何为自托管Strapi配置Azure Entra ID认证连接PostgreSQL?
如何为自托管Strapi配置Azure Entra ID无密码连接PostgreSQL
Strapi本身没有直接提供Azure Entra ID(原Azure AD)认证的配置项,但可以通过PostgreSQL客户端库(pg)的扩展能力,结合Azure身份验证库实现无密码连接。以下是具体实现步骤:
1. 安装依赖
首先安装Azure身份验证库,用于动态获取AD访问令牌:
npm install @azure/identity
pg是Strapi连接PostgreSQL的默认依赖,无需重复安装。
2. 修改Strapi数据库配置
编辑Strapi的数据库配置文件(通常为config/database.js,TypeScript项目为config/database.ts),替换原有的用户名/密码配置,改为动态获取AD令牌并配置连接池自动刷新:
JavaScript版本示例
const { DefaultAzureCredential } = require('@azure/identity'); module.exports = ({ env }) => { // 初始化Azure默认凭据,自动适配本地/生产环境的身份验证方式 const credential = new DefaultAzureCredential(); // 获取PostgreSQL的Azure AD访问令牌 const getAccessToken = async () => { // PostgreSQL的AD资源标识固定为https://ossrdbms-aad.database.windows.net/.default const token = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default'); return token.token; }; return { connection: { client: 'postgres', connection: { host: env('DATABASE_HOST', '<your-db-server>.postgres.database.azure.com'), port: env.int('DATABASE_PORT', 5432), database: env('DATABASE_NAME', '<your-db-name>'), // 此处填写有权限连接数据库的Azure AD主体名称(如用户邮箱、服务主体ID) user: env('DATABASE_AD_USER', '<azure-ad-principal>'), // 动态注入AD令牌作为密码 password: getAccessToken(), ssl: { rejectUnauthorized: env.bool('DATABASE_SSL', true), }, // 配置连接池自动刷新令牌,避免令牌过期导致连接失效 pool: { refreshAuthCallback: async (client) => { const newToken = await getAccessToken(); client.password = newToken; return newToken; }, // 每30分钟刷新一次令牌(Azure AD令牌有效期通常为60分钟) refreshAuthIntervalMillis: 30 * 60 * 1000, }, }, useNullAsDefault: true, }, }; };
TypeScript版本示例
import { DefaultAzureCredential } from '@azure/identity'; import type { StrapiConfig } from '@strapi/types'; export default ({ env }: StrapiConfig) => { const credential = new DefaultAzureCredential(); const getAccessToken = async () => { const token = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default'); return token?.token || ''; }; return { connection: { client: 'postgres', connection: { host: env('DATABASE_HOST', '<your-db-server>.postgres.database.azure.com'), port: env.int('DATABASE_PORT', 5432), database: env('DATABASE_NAME', '<your-db-name>'), user: env('DATABASE_AD_USER', '<azure-ad-principal>'), password: getAccessToken(), ssl: { rejectUnauthorized: env.bool('DATABASE_SSL', true), }, pool: { refreshAuthCallback: async (client) => { const newToken = await getAccessToken(); client.password = newToken; return newToken; }, refreshAuthIntervalMillis: 30 * 60 * 1000, }, }, useNullAsDefault: true, }, }; };
3. 环境配置与权限验证
- 本地开发:确保已通过Azure CLI登录(
az login),DefaultAzureCredential会自动使用CLI的身份信息。 - 生产环境:可使用Azure托管标识、服务主体等方式,确保Strapi运行环境拥有获取AD令牌的权限。
- 数据库权限:确保配置的Azure AD主体已被授予PostgreSQL数据库的访问权限(如添加为数据库用户并分配对应角色)。
- 服务器配置:Azure PostgreSQL服务器已启用Azure AD认证(在Azure门户的服务器“身份验证”选项卡中配置)。
内容的提问来源于stack exchange,提问作者Bob Lokerse
相关产品推荐
相关产品推荐

