You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中如何将MSAL的客户端密钥替换为客户端证书实现OAuth2.0认证

切换MSAL Node.js到客户端证书认证的修改步骤

要将你的Node.js应用从客户端密钥认证切换到客户端证书认证,需要对MSAL配置和证书读取逻辑做以下调整:

1. 准备客户端证书

你需要拥有一个符合要求的客户端证书:

  • 格式可以是PEM(含私钥)或PKCS#12(.pfx)
  • 已在Azure AD应用注册中上传该证书的公钥部分(确保Azure AD能识别此证书)
  • 获取证书的thumbprint(指纹),可以通过openssl命令生成:
    openssl x509 -in your-certificate.pem -fingerprint -noout | sed 's/://g'
    

2. 修改MSAL配置与代码

移除clientSecret,添加clientCertificate配置

替换原来的auth配置,移除clientSecret字段,新增clientCertificate字段,包含私钥和证书thumbprint。

完整修改后的代码示例(PEM证书)

const fs = require('fs');
const path = require('path');
const msal = require('@azure/msal-node');
const axios = require('axios');

// 读取本地PEM格式的证书私钥
const privateKey = fs.readFileSync(path.join(__dirname, 'your-certificate.pem'), 'utf8');
// 替换为你的证书thumbprint
const certificateThumbprint = 'YOUR_CERTIFICATE_THUMBPRINT';

const config = {
    auth: {
        clientId: clientId,
        authority: `https://login.microsoftonline.com/${tenantId}`,
        // 移除clientSecret,添加客户端证书配置
        clientCertificate: {
            privateKey: privateKey,
            thumbprint: certificateThumbprint
            // 可选:若需要传递完整证书链,添加x5c字段(Base64编码的证书链)
            // x5c: 'BASE64_ENCODED_CERTIFICATE_CHAIN'
        }
    }
};

const cca = new msal.ConfidentialClientApplication(config);

const request = {
    scopes: ['https://graph.microsoft.com/.default'],
};

async function getAccessToken() {
    try {
        const response = await cca.acquireTokenByClientCredential(request);
        return response.accessToken;
    } catch (error) {
        console.error(`Error acquiring token: ${error}`);
    }
}

async function listUsers() {
    const token = await getAccessToken();
    if (!token) {
        console.error('Failed to acquire access token');
        return;
    }

    const options = {
        headers: {
            'Authorization': `Bearer ${token}`
        }
    };

    try {
        const response = await axios.get('https://graph.microsoft.com/v1.0/users', options);
        console.log(response.data);
    } catch (error) {
        console.error(`Error fetching users: ${error}`);
    }
}

若使用PKCS#12(.pfx)证书

如果你的证书是PFX格式,需要先解析证书提取私钥:

const pkcs12 = require('pkcs12');
const fs = require('fs');
const path = require('path');

const pfxBuffer = fs.readFileSync(path.join(__dirname, 'your-certificate.pfx'));
// 替换为你的PFX证书密码
const pfxPassword = 'YOUR_PFX_PASSWORD';
const pfxData = pkcs12.decode(pfxBuffer, pfxPassword);

// 提取私钥
const privateKey = pfxData.key.toString('utf8');
// 提取证书thumbprint(也可以用之前的openssl命令获取)
const certificateThumbprint = pfxData.cert.fingerprint.replace(/:/g, '');

3. 无需修改的部分

getAccessToken和listUsers函数不需要任何修改,MSAL会自动使用客户端证书完成OAuth 2.0的客户端认证流程,获取访问令牌后调用Graph API的逻辑保持不变。

内容的提问来源于stack exchange,提问作者user1383010

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:03:14