@boxyhq/saml20

中文文档
3.1.0发布于 2026/11/06MITTypeScriptCommonJS构建来源已验证近 30 天下载 56.4万

SAML 2. 0 节点符号解析器

中文使用文档
文档目录10 节
  1. 安装
  2. 使用量
  3. saml.validate( 缩写, 选项)
  4. saml.parseIssuer( 缩写响应)
  5. saml.validate Signature(xml,公钥,指印,选项?)
  6. 升级到 2. 0
  7. 测试
  8. 捐款
  9. 报告安全问题
  10. 许可证

SAML 2.0 解析器和验证器

Build Status

一个用于Node.js的 SAML 2.0 库:它验证了 SAML 响应,并创建和剖析 Authn Requests, 登录消息和元数据. 它开始作为叉子 萨姆尔20 从那时起,他背离了它。 Ory维护它,它出版于npm作为 @boxyhq/saml20。 。 。 .

安装

$ npm install @boxyhq/saml20

使用量

validate() 返回一个承诺.

saml.validate( 缩写, 选项)

验证一个 SAML 响应(或一个孤独的 Assertion),并与用户的配置解析. 当一切失败的时候,它否认真理 StatusCode、缺失或无效的签名、过期的断言或失败的听众, InResponseTo, (中文(简体) ), Recipient 或者重新播放检查.

rawResponse 是 XML 作为字符串( 解码基数64) SAMLResponse 格式字段为先).

options (脚本 : ValidateOptions:

  • publicKey:可信任的IDP签名证书,作为Base64 DER或PEM. 几个证书(用于密钥旋转)用逗号分隔.
  • thumbprint:信任证书的 SHA-1 拇指印,逗号分隔. 证书本身取自 KeyInfo 的签名。 也通过 publicKey 或者说 thumbprint而不是两个.
  • privateKey (可选):解密a EncryptedAssertion。 。 。 .
  • audience:预期的观众,或被接受的观众名单. 每个 AudienceRestriction 在断言中,必须确切指明其中之一。 失败者 Invalid audience. 缺少或空值失败 audience is required.
  • inResponseTo (可选): AuthnRequest 此回复答案 。 设定时, 签名的内容必须带有相同的 InResponseTo; 缺少值失败。 失败者 Invalid InResponseTo.
  • recipient (可选). ACS URL的响应被张贴到,或者它可能已经张贴到的ACS URL列表(对于一个在几个地址接受响应的SP来说). 设定后,签名的内容必须命名(其中之一,每个候选人自行判断):签名 Response/@Destination 当任何携带者 SubjectConfirmationData 携带一个 Recipient,一个无记名确认书必须既取名,又在自己的范围内 NotBefore编号 :NotOnOrAfter 窗口(如此) NotOnOrAfter 需要为此而努力; bypassExpiration 跳过此窗口检查, 但不是 Recipient 两者中至少有一人必须在场。 一个空的 Recipient 计数为当前且从未匹配。 未签名者 Response 包装从不使用。 失败者 Invalid Recipient. 空字符串、 空列表或带有空条目的列表失败 recipient must be a non-empty URL or a non-empty list of them.
  • assertionReplayValidator (可选) : (info) => boolean | Promise<boolean>,在每张支票后打来 { assertionId, sessionIndex, notOnOrAfter, inResponseTo } 从签名的断言。 返回时 true 如果该断言已经使用,则该反应作为回放被拒绝。 每个条目至少保存到 notOnOrAfter 加上10分钟,时钟摇摆 validate() 允许.
  • bypassExpiration (可选). 这种旗帜表示过期验证绕行(可用于测试,在生产环境中不推荐);
  • allowedSignatureAlgorithms 编号 : allowedHashAlgorithms (可选). 算法允许列表转发到 validateSignature,见下文.
  • maxSignatureReferences (可选). 上限 SignedInfo/Reference 页:1 validateSignature,见下文.
const saml = require('@boxyhq/saml20').default;

const profile = await saml.validate(rawResponse, {
  publicKey: 'MIICDzCCAXygAwIBAgIQVWXAvbbQyI5Bc...',
  audience: 'https://sp.example.com',
  inResponseTo: requestId,
  recipient: 'https://sp.example.com/acs',
});

const { claims, issuer, sessionIndex, assertionId, notOnOrAfter } = profile;

错误是 Errors 有固定消息。 当原因更为具体(例如,为什么签名失败)时,错误是 WrapError 和原因在 error.inner。 。 。 .

saml.parseIssuer( 缩写响应)

返回 Issuer 无法验证任何东西。 用它来找出一个响应的IP声称来自哪一个, 这样你就可以选择证书传递给 validate()。 。 。 .

const issuer = saml.parseIssuer(rawResponse);

saml.validate Signature(xml,公钥,指印,选项?)

验证 XML 签名于 xml 并返回已签名的 XML 。 从返回值而不是从 xml:只覆盖已签名的内容. 它在签名无效或无法检查时丢出; 不验证失败的签名 invalid signature: the signature does not verify。通过 publicKey (一个证书,或用逗号分隔若干个键旋转)或 thumbprint而不是两个.

options (可选)限制哪些算法被接受 :

  • allowedSignatureAlgorithms ——已接受 SignatureMethod (原始内容存档于2018-10-21). URIs.
  • allowedHashAlgorithms ——已接受 DigestMethod (原始内容存档于2018-10-21). URIs.

省略允许列表时, 默认设置从 xml-crypto 应用(RSA-SHA1,RSA-SHA256,RSA-SHA512和SHA-1,SHA-256,SHA-512摘要). 当给出一个时,一个使用任何其他算法的文档会被拒绝;一个空列表会拒绝一切.

  • maxSignatureReferences ——最大数量 Reference 签字时接受的要素 SignedInfo (默认16). 一个SAML的签名就有一个 天花板束缚着工作 xml-crypto 在核查之前 SignatureValue:每个引用都先被cononicalized,所以一个没有被约束的列表是未经认证的CPU拒绝服务. 超过上限的文件被拒绝 invalid signature: SignedInfo declares N References; at most M are allowed,在任何卡通化之前.
var saml = require('@boxyhq/saml20').default;

var signedXml = saml.validateSignature(xml, publicKey, null, {
  allowedSignatureAlgorithms: [
    'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
    'http://www.w3.org/2001/04/xmldsig-more#rsa-sha512',
  ],
  allowedHashAlgorithms: [
    'http://www.w3.org/2001/04/xmlenc#sha256',
    'http://www.w3.org/2001/04/xmlenc#sha512',
  ],
});

升级到 2. 0

2.0 删除已贬值或波利斯不再使用的API:

  • 只有包根可以被导入. package.json 现在有一个 exports 地图,所以软件包中的路径如下: @boxyhq/saml20/dist/typings 失败 ERR_PACKAGE_PATH_NOT_EXPORTED (与TS2307一起) moduleResolution node16, (中文(简体) ), nodenext 或者说 bundler) (中文(简体) ). 例如从根导入 import type { SAMLProfile } from '@boxyhq/saml20'。所有根输出都列在 test/lib/compat.spec.ts。 。 。 .
  • parse() 不见了 它在不检查签名,过期,观众或其他任何内容的情况下还原了一个剖面图,因此其输出可以被伪造. 使用 validate() 认证回复,以及 parseIssuer() 在验证前读取发行人(例如,选择IDP证书).
  • decryptXml 财务报告和审定财务报表 PubKeyInfo 不再从软件包根导出。 他们是内部帮手 validate() 财务报告和审定财务报表 sign()。 。 。 .
  • hasValidSignature 删除。 使用 validateSignature(),它也拒绝给予证书和拇指印.
  • isMultiRootedXMLError 删除。 以错误拒绝多根文档 multirooted xml not allowed.
  • strictAudienceValidation 观众总是被精确对比 在2.0之前,没有这个选项 Audience 仅仅从预期价值开始就被接受(https://sp.example.com/metadata.evil.example 通过了 https://sp.example.com/metadata) (中文(简体) ). 如果你依赖前缀匹配,通过所有接受的观众在 audience 换句话说.
  • validateSignature() 当签名无法校验时, 丢出它用来返回的地方 null。它现在要么返回签名的 XML ,要么丢出.
  • audience 需要时间。 在2.0之前,留它出去跳过观众检查,所以为其他信任同一IP的服务提供商发布的断言被接受.
  • parseMetadata(), (中文(简体) ), parseSAMLRequest(), (中文(简体) ), parseLogoutRequest() 财务报告和审定财务报表 parseLogoutResponse() 用相同的 XML 解析器解析为 validate() (单位:千美元)@xmldom/xmldom改为 xml2js。它们现在拒绝一个有多个根元素的文档。 文档使用的名称空间前缀而不声明它仍然被接受(前缀不参与结果),以及带有属性的证书元素. 文本和属性值得到线程和白空常态 XML 需要,所以用 CRLF 线程结尾粘贴的证书会在 LF 中返回 publicKey (数量) thumbprint 原文不变)。 例如, 解析器信件中存在错误的文档失败 missing root element 改为 Non-whitespace before first tag.,则 & 不开始引用( e)a & b失败 Invalid XML.
  • 那个XML request(), (中文(简体) ), createSAMLResponse(), (中文(简体) ), createLogoutRequest(), (中文(简体) ), createLogoutResponse(), (中文(简体) ), createIdPMetadataXML() 财务报告和审定财务报表 createSPMetadataXML() 产品按序列排列 xmlbuilder2 改为 xmlbuilder。这些文档是相同的,只是已经存在于一个祖先范围内的命名空间声明不会在后人身上重复,带有空文本的元素写成 <a></a> 而不是说 <a/>A级 saml:Assertion 从 createSAMLResponse() 仍然声明它使用的每一个前缀,所以当它从它的 samlp:Response。 。 。 .

测试

$ npm test            # node:test with coverage
$ npm run typecheck   # type-checks lib/ and test/
$ npm run lint       # oxlint

修补者住在 test/assets。需要新有效性窗口的测试,或固定装置没有、构建和在辅助工具中签名的形状 test/helpers/fixtures.ts。 。 。 .

捐款

谢谢你花时间捐款! 贡献使得开放源码社区成为学习、激励和创造的惊人场所。 你所做的任何贡献都将造福所有人,并受到赞赏.

报告错误 GitHub 问题。请尝试创建以下错误报告:

  • 可复制. 包括复制问题的步骤.
  • 具体. 包括尽可能多的细节:哪个版本,什么环境等.
  • 独出一辙. 不重复已打开的问题 .
  • 范围为单虫. 每个报告一个错误.

报告安全问题

负责任的披露

许可证

麻省理工学院

版本与发布记录

@boxyhq/saml20 共发布 121 个版本,首次发布于 2021/08/23;过去 12 个月发布了 21 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.1.0latest2026/11/062 天前
3.0.02026/11/053 天前
2.1.02026/11/035 天前
2.0.12026/11/026 天前
2.0.02026/10/2514 天前
1.22.02026/10/1226 天前

其他发布通道:beta → 1.5.1-beta.1723。

关于 @boxyhq/saml20 的常见问题

@boxyhq/saml20 是什么?

SAML 2. 0 节点符号解析器

如何安装 @boxyhq/saml20?

在项目目录运行 npm install @boxyhq/saml20,或使用 pnpm add / yarn add / bun add。

@boxyhq/saml20 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@boxyhq/saml20 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@boxyhq/saml20 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22.12.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@boxyhq/saml20 可以商用吗?

@boxyhq/saml20 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@boxyhq/saml20 的下载量有多少?

根据 npm 官方下载统计,@boxyhq/saml20 在 2026/10/09 – 2026/11/07 这 30 天内被下载 563,573 次,日均约 18,786 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@boxyhq/saml20 还在维护吗?

最新版本 3.1.0 发布于 2026/11/06(2 天前);至今共发布 121 个版本,其中过去 12 个月发布了 21 个;首次发布于 2021/08/23。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。