@darioackermann/saml2-js

中文文档
7.1.0发布于 2025/03/31Apache-2.0CommonJS近 30 天下载 2434

SAML 2.0 node helpers

原始使用文档
文档目录6 节
  1. Fork Notice
  2. Usage
  3. Documentation
  4. ServiceProvider(options)
  5. IdentityProvider(options)
  6. Example: Express implementation

@darioackermann/saml2-js

@darioackermann/saml2-js is a node module that abstracts away the complexities of the SAML protocol behind an easy to use interface. It achieves this this by helping you implement a service provider for the SAML protocol. It currently does not implement the features to act as an identity provider.

Fork Notice

This is a fork of Clever/saml2-js I'll ensure that dependencies are regularly updated. PRs extending currently available functionality are welcome.

Usage

Install with npm.

  npm install @darioackermann/saml2-js --save

Include the SAML library.

  var saml2 = require('@darioackermann/saml2-js');

Documentation

This library exports two constructors.

  • ServiceProvider - Represents a service provider that relies on a trusted IdentityProvider for authentication and authorization in the SAML flow.
  • IdentityProvider - Represents an online service that authenticates users in the SAML flow.

Note: Some options can be set on the SP, IdP, and/or on a per-method basis. For the options that are set in multiple places, they are overridden in the following order: per-method basis overrides IdP which overrides SP.

ServiceProvider(options)

Represents a service provider that relies on a trusted IdentityProvider for authentication and authorization in the SAML flow.

Options

An object that can contain the below options. All options are strings, unless specified otherwise. See note for more information on options.

  • entity_id - Required - Unique identifier for the service provider, often the URL of the metadata file.
  • private_key - Required - (PEM format string) - Private key for the service provider.
  • certificate - Required - (PEM format string) - Certificate for the service provider.
  • assert_endpoint - Required - URL of service provider assert endpoint.
  • alt_private_keys - (Array of PEM format strings) - Additional private keys to use when attempting to decrypt responses. Useful for adding backward-compatibility for old certificates after a rollover.
  • alt_certs - (Array of PEM format strings) - Additional certificates to expose in the SAML metadata. Useful for staging new certificates for rollovers.
  • audience - (String or RegExp) — If set, at least one of the <Audience> values within the <AudienceRestriction> condition of a SAML authentication response must match. Defaults to entity_id.
  • notbefore_skew - (Number) – To account for clock skew between IdP and SP, accept responses with a NotBefore condition ahead of the current time (according to our clock) by this number of seconds. Defaults to 1. Set it to 0 for optimum security but no tolerance for clock skew.
  • force_authn - (Boolean) - If true, forces re-authentication of users even if the user has a SSO session with the IdP. This can also be configured on the IdP or on a per-method basis.
  • auth_context - Specifies AuthnContextClassRef. This can also be configured on a per-method basis.
  • nameid_format - Format for Name ID. This can also be configured on a per-method basis.
  • sign_get_request - (Boolean) - If true, signs the request. This can also be configured on the IdP or on a per-method basis.
  • allow_unencrypted_assertion - (Boolean) - If true, allows unencrypted assertions. This can also be configured on the IdP or on a per-method basis.

Returns the following functions

Example


  var sp_options = {
    entity_id: "https://sp.example.com/metadata.xml",
    private_key: fs.readFileSync("key-file.pem").toString(),
    certificate: fs.readFileSync("cert-file.crt").toString(),
    assert_endpoint: "https://sp.example.com/assert",
    force_authn: true,
    auth_context: { comparison: "exact", class_refs: ["urn:oasis:names:tc:SAML:1.0:am:password"] },
    nameid_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient",
    sign_get_request: false,
    allow_unencrypted_assertion: true
  }

  // Call service provider constructor with options
  var sp = new saml2.ServiceProvider(sp_options);

  // Example use of service provider.
  // Call metadata to get XML metatadata used in configuration.
  var metadata = sp.create_metadata();

Service provider function definitions

create_login_request_url(IdP, options, cb)

Get a URL to initiate a login.

Takes the following arguments:

  • IdP - IdP
  • options - An object that can contain the below options. All options are strings, unless specified otherwise. See note for more information on options.
    • relay_state - SAML relay state.
    • auth_context - Specifies AuthnContextClassRef. This can also be configured on the SP.
    • nameid_format - Format for Name ID. This can also be configured on the SP.
    • force_authn- (Boolean) - If true, forces re-authentication of users even if the user has a SSO session with the IdP. This can also be configured on the IdP or SP.
    • sign_get_request - (Boolean) - If true, signs the request. This can also be configured on the IdP or SP.
  • cb(error, login_url, request_id) - Callback called with the login URL and ID of the request.
redirect_assert(IdP, options, cb)

Gets a SAML response object if the login attempt is valid, used for redirect binding.

Takes the following arguments:

  • IdP - IdP
  • options - An object that can contain the below options. All options are strings, unless specified otherwise. See note for more information on options.
    • request_body - (Object) - An object containing the parsed query string parameters. This object should contain the value for either a SAMLResponse or SAMLRequest.
    • allow_unencrypted_assertion - (Boolean) - If true, allows unencrypted assertions. This can also be configured on the IdP or SP.
    • require_session_index - (Boolean) - If false, allow the assertion to be valid without a SessionIndex attribute on the AuthnStatement node.
  • cb(error, response) - Callback called with the request response.
Example of the SAML assert response returned:
{ response_header:
   { id: '_abc-1',
     destination: 'https://sp.example.com/assert',
     in_response_to: '_abc-2' },
  type: 'authn_response',
  user:
   { name_id: 'nameid',
     session_index: '_abc-3',
     assertion_id: '_123',
     attributes:
      { 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname': [ 'Test' ] } } }
post_assert(IdP, options, cb)

Gets a SAML response object if the login attempt is valid, used for post binding.

Takes the following arguments:

  • IdP - IdP
  • options - An object that can contain the below options. All options are strings, unless specified otherwise. See note for more information on options.
    • request_body - (Object) - An object containing the parsed query string parameters. This object should contain the value for either a SAMLResponse or SAMLRequest.
    • allow_unencrypted_assertion - (Boolean) - If true, allows unencrypted assertions. This can also be configured on the IdP or SP.
    • require_session_index - (Boolean) - If false, allow the assertion to be valid without a SessionIndex attribute on the AuthnStatement node.
    • audience - (String or RegExp) — If set, at least one of the <Audience> values within the <AudienceRestriction> condition of a SAML authentication response must match. Defaults to entity_id.
    • notbefore_skew - (Number) – To account for clock skew between IdP and SP, accept responses with a NotBefore condition ahead of the current time (according to our clock) by this number of seconds. Defaults to 1. Set it to 0 for optimum security but no tolerance for clock skew.
  • cb(error, response) - Callback called with the request response.
create_logout_request_url(IdP, options, cb)

Creates a SAML Request URL to initiate a user logout.

Takes the following arguments:

  • IdP - IdP. Note: Can pass sso_logout_url instead of IdP.
  • options - An object that can contain the below options. All options are strings, unless specified otherwise. See note for more information on options.
    • name_id - Format for Name ID. This can also be configured on a per-method basis.
    • session_index - Session index to use for creating logout request.
    • allow_unencrypted_assertion - (Boolean) - If true, allows unencrypted assertions. This can also be configured on the IdP or SP.
    • sign_get_request - (Boolean) - If true, signs the request. This can also be configured on the IdP or SP.
    • relay_state - SAML relay state.
  • cb(error, request_url) - Callback called with the logout request url.
create_logout_response_url(IdP, options, cb)

Creates a SAML Response URL to confirm a successful IdP initiated logout.

Takes the following arguments:

  • IdP - IdP. Note: Can pass sso_logout_url instead of IdP.
  • options - An object that can contain the below options. All options are strings, unless specified otherwise. See note for more information on options.
    • in_response_to - The ID of the request that this is in response to. Should be checked against any sent request IDs.
    • sign_get_request - (Boolean) - If true, signs the request. This can also be configured on the IdP or SP.
    • relay_state - SAML relay state.
  • cb(error, response_url) - Callback called with the logout response url.
create_metadata()

Returns the XML metadata used during the initial SAML configuration.

IdentityProvider(options)

Represents an online service that authenticates users in the SAML flow.

Returns no functions, exists solely to be passed to an SP function.

Options

An object that can contain the below options. All options are strings, unless specified otherwise. See note for more information on options.

  • sso_login_url - Required - Login url to use during a login request.
  • sso_logout_url - Required - Logout url to use during a logout request.
  • certificates - Required - (PEM format string or array of PEM format strings) - Certificate or certificates (array of certificate) for the identity provider.
  • force_authn - (Boolean) - If true, forces re-authentication of users even if the user has a SSO session with the IdP. This can also be configured on the SP or on a per-method basis.
  • sign_get_request - (Boolean) - If true, signs the request. This can also be configured on the [SP or on a per-method basis.
  • allow_unencrypted_assertion - (Boolean) - If true, allows unencrypted assertions. This can also be configured on the SP or on a per-method basis.

Example


  // Initialize options object
  var idp_options = {
    sso_login_url: "https://idp.example.com/login",
    sso_logout_url: "https://idp.example.com/logout",
    certificates: [fs.readFileSync("cert-file1.crt").toString(), fs.readFileSync("cert-file2.crt").toString()],
    force_authn: true,
    sign_get_request: false,
    allow_unencrypted_assertion: false
  };

  // Call identity provider constructor with options
  var idp = new saml2.IdentityProvider(idp_options);

  // Example usage of identity provider.
  // Pass identity provider into a service provider function with options and a callback.
  sp.post_assert(idp, {}, callback);

Example: Express implementation

Library users will need to implement a set of URL endpoints, here is an example of express endpoints.

var saml2 = require('saml2-js');
var fs = require('fs');
var express = require('express');
var app = express();
// If you're using express <4.0:
// var bodyParser = require('body-parser');
// app.use(bodyParser.urlencoded({
//   extended: true
// }));
app.use(express.urlencoded());

// Create service provider
var sp_options = {
  entity_id: "https://sp.example.com/metadata.xml",
  private_key: fs.readFileSync("key-file.pem").toString(),
  certificate: fs.readFileSync("cert-file.crt").toString(),
  assert_endpoint: "https://sp.example.com/assert"
};
var sp = new saml2.ServiceProvider(sp_options);

// Create identity provider
var idp_options = {
  sso_login_url: "https://idp.example.com/login",
  sso_logout_url: "https://idp.example.com/logout",
  certificates: [fs.readFileSync("cert-file1.crt").toString(), fs.readFileSync("cert-file2.crt").toString()]
};
var idp = new saml2.IdentityProvider(idp_options);

// ------ Define express endpoints ------

// Endpoint to retrieve metadata
app.get("/metadata.xml", function(req, res) {
  res.type('application/xml');
  res.send(sp.create_metadata());
});

// Starting point for login
app.get("/login", function(req, res) {
  sp.create_login_request_url(idp, {}, function(err, login_url, request_id) {
    if (err != null)
      return res.send(500);
    res.redirect(login_url);
  });
});

// Variables used in login/logout process
var name_id, session_index;

// Assert endpoint for when login completes
app.post("/assert", function(req, res) {
  var options = {request_body: req.body};
  sp.post_assert(idp, options, function(err, saml_response) {
    if (err != null)
      return res.send(500);

    // Save name_id and session_index for logout
    // Note:  In practice these should be saved in the user session, not globally.
    name_id = saml_response.user.name_id;
    session_index = saml_response.user.session_index;

    res.send("Hello #{name_id}! session_index: #{session_index}.");
  });
});

// Starting point for logout
app.get("/logout", function(req, res) {
  var options = {
    name_id: name_id,
    session_index: session_index
  };

  sp.create_logout_request_url(idp, options, function(err, logout_url) {
    if (err != null)
      return res.send(500);
    res.redirect(logout_url);
  });
});

app.listen(3000);

版本与发布记录

@darioackermann/saml2-js 共发布 10 个版本,首次发布于 2022/08/12;过去 12 个月发布了 0 个版本。

版本发布日期距今
7.1.0latest2025/03/311.6 年前
7.0.02025/02/031.8 年前
6.0.02024/12/291.9 年前
5.0.02024/06/062 年前
5.0.0-rc.02024/06/062 年前
4.0.22023/07/253 年前

关于 @darioackermann/saml2-js 的常见问题

@darioackermann/saml2-js 是什么?

SAML 2.0 node helpers

如何安装 @darioackermann/saml2-js?

在项目目录运行 npm install @darioackermann/saml2-js,或使用 pnpm add / yarn add / bun add。

@darioackermann/saml2-js 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/darioackermann__saml2-js 是否存在。

@darioackermann/saml2-js 支持 ESM 还是 CommonJS?

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

@darioackermann/saml2-js 需要什么版本的 Node.js?

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

@darioackermann/saml2-js 可以商用吗?

@darioackermann/saml2-js 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@darioackermann/saml2-js 的下载量有多少?

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

@darioackermann/saml2-js 还在维护吗?

最新版本 7.1.0 发布于 2025/03/31(1.6 年前);至今共发布 10 个版本,其中过去 12 个月发布了 0 个;首次发布于 2022/08/12。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。