You need to enable JavaScript to run this app. 如何在容器化Node.js Azure Function中使用证书完成MS Graph身份验证
优惠活动
大模型
产品
解决方案
定价
更多

如何在容器化Node.js Azure Function中使用证书完成MS Graph身份验证

实现方案

1. 前置资源配置

  • 先在Azure AD注册应用,为该应用分配Microsoft Graph所需的应用权限,完成管理员同意授权。
  • 生成自签名证书或导入商用证书到Azure Key Vault,开启证书自动续期配置。
  • 为Azure Function App的托管身份分配Key Vault的证书获取权限;如果使用Function App TLS加载证书,还需要额外分配密钥获取权限(Key Vault中的证书导出为pfx时会以密钥形式存储)。
  • 配置Function App应用设置,添加参数WEBSITE_LOAD_CERTIFICATES,值填对应证书的指纹,若要加载所有可访问证书可填*。该配置会自动把Key Vault中的证书同步加载到Function App运行环境的证书存储中,容器化场景下同样生效。

2. 容器内部证书获取逻辑

两种可选实现方式,均满足容器内完成认证的要求:

方式一:通过Function App预加载证书直接读取

  • Windows容器场景下,证书会加载到Cert:\CurrentUser\My证书存储,Node.js可使用win-ca类库读取对应指纹的证书,导出为pem格式即可。
  • Linux容器场景下,预加载的证书会放在/var/ssl/certs目录下,文件名为证书的指纹,直接读取对应路径的文件即可。

该方式无需自行编写Key Vault调用逻辑,证书自动续期后Function App会自动同步新证书到容器环境,无需修改代码。

方式二:代码直接从Key Vault拉取证书

  • 使用Azure Identity库的DefaultAzureCredential,在容器内自动获取Function App的托管身份凭证,无需手动配置密钥。
  • 调用Key Vault Certificates客户端的getCertificate接口拉取证书内容,导出为pfx或pem格式用于身份认证。
  • 代码中添加缓存逻辑,设置证书过期前1天自动重新拉取,适配自动续期场景。

3. Node.js身份认证对接Microsoft Graph

使用MSAL Node库实现身份认证,配置客户端证书流,参数传入前序步骤获取的证书内容、Azure AD应用的客户端ID、租户ID即可,示例代码如下:

const { ConfidentialClientApplication } = require('@azure/msal-node');
const fs = require('fs');

// 示例为Linux容器下读取预加载证书的逻辑,路径和文件名可从环境变量注入
const certificateContent = fs.readFileSync('/var/ssl/certs/你的证书指纹.pem', 'utf8');

const msalConfig = {
  auth: {
    clientId: "你的AAD应用客户端ID",
    authority: "https://login.microsoftonline.com/你的租户ID",
    clientCertificate: {
      thumbprint: "你的证书指纹",
      privateKey: certificateContent,
    }
  }
};

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

const cca = new ConfidentialClientApplication(msalConfig);
// 获取Graph访问令牌
const accessToken = await cca.acquireTokenByClientCredential(tokenRequest);

拿到访问令牌后即可正常调用Microsoft Graph接口。

4. 容器镜像适配注意事项

  • 禁止把证书打包到镜像内,所有证书均通过运行时读取,避免证书过期后需要重新构建镜像。
  • Linux镜像如果用到证书相关依赖,确保预装了ca-certificates包,避免证书校验失败。
  • 不要在代码中硬编码任何密钥、证书指纹、客户端ID等配置,所有参数都通过Function App的应用设置注入到容器环境变量中读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 05:45:08