简介
wicked-saml 是一个 npm 包,它提供了一种使用 SAML(Security Assertion Markup Language)进行身份验证的简单方法。它可以用于 Node.js 应用程序以及用于使用 Node.js 的其他后端应用程序。
在这篇文章中,我们将了解如何使用 wicked-saml 进行身份验证,并将在示例应用程序中演示他的用法。
安装
在使用 wicked-saml 之前,您需要先安装它。您可以使用 npm 进行安装:
npm install wicked-saml --save
使用
在您的应用程序中使用 wicked-saml 是相当简单的。首先,您需要将身份提供程序的元数据下载到您的项目中。这是由身份提供程序提供的 XML 文件。该文件将包含有关实体和其公钥的元数据。
下载完元数据,你可以将其用于 SAML 验证:
-- -------------------- ---- ------- ----- ---- - ----------------------- ----- -- - -------------- ----- ---- - --- ------- -- ---- -------- ---- ---- ----- -------- - ----------------------------------- -------- -- ------ --- --------- ----- -------- - ----- ---------------------- ----- - ------------- ------ ----------- ----- -- --------- -------------- ------ ------------------------ ----- ----------------- ----- --- -- ----------- - ----------------------------- --------- ------- - -- --- --------- --- --------- --- --- --- --- ---- ---- ---- --- ---- --------- ----- ------ - ----------------- ----- ---------- - ---------------------
其中,你需要将身份提供程序的元数据传递给 saml 的 verifyAssertion 方法。这个方法将检查 SAML 响应是否有效,并将返回一个布尔值指示验证是否通过。如果验证通过,您可以从 SAML 声明中获取用户信息。
示例应用程序
让我们创建一个简单的示例应用程序来显示如何使用 wicked-saml 来验证用户身份。该应用程序将仅包含一个登录和一个访问受保护的页面的简单示例。
我们的示例应用程序将与名为 idp.example.com 的身份提供程序进行通信。元数据文件可以在 http://idp.example.com/metadata.xml
上获得。
默认元数据中的配置
示例 metadata.xml
文件将包含以下内容:
-- -------------------- ---- ------- ----------------- ------------------------------------------ --------------------------------------------- ----------------- --------------------------------------------------- -------------------------------------- -------------- -------------- -------- ------------------------------------------- ---------- ------------------------------------------ ----------- ---------- ---------------- -------------------- ------------------------------------------------------------ ------------------------------------------- ---------------------------------------------------------------------------------- -------------------- ------------------------------------------------------------ ------------------------------------------ ------------------- -------------------
在这个元数据文件中,我们可以看到在单点登录服务(Single Sign-On Service)中,使用了 HTTP-Redirect 的绑定(Binding)。回调地址(Recipient)指向我们自己的节点应该接收起事务的结果。
创建示例应用程序
在本示例的 package.json
文件中,示例应用程序使用 express
作为静态文件服务器。
-- -------------------- ---- ------- - ------- --------------- ---------- -------- -------------- ----- ------- ------------- ------- ----------- --------------- - ---------- ---------- -------------- -------- - -
index.js
首先,我们需要将模块粘贴到 index.js 中,并使用它来启动我们的服务器:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- ------------ - ------------------------- ----- ------- - --------------------------- ----- ---- - ----------------------- ----- -- - -------------- ----- ---- - ---------------- -- ----- ----- --- - ---------- ------------------------------- --------- ----- ---- --------------------------- ------------------------ -------- --------- ------- --------- ------ ----- ------- ----- ------------------ ----- -- -- ------------ ----- ---- -- - ------------ -------------------------- --- ----------------- ----- ----- ---- -- - ----- ---- - --- ------- ----- -------------- - -------------------------------------- ----- -------- - ----- ---------------------------------- ----- ------- - - ----------- ---- ------------ ------------------- - ---- - ---------------- -- -- ---- --- -------- -------- ----------- ------------------------------------------ -- ----- ----------- - ----- -------------------------------- ---------- -------------------------- --- ------------------------- ----- ----- ---- -- - ----- ---- - --- ------- ----- -------------- - -------------------------------------- ----- -------- - ----- ---------------------------------- ----- ------- - - --------- -------------- ------ ------------------------ ----- ----------------- ----- -- --- - ----- - -------- ---- - - ----- ----------------------------------------- --------- -- ------------- - ---------------- - ------------ ------------------ - ---- - ----------------------------- ---- ------------ - - ----- --- - ----------------- --------------------------- -------- ----- ------- ---- ------------ - --- --------------------- ----- ---- -- - -- ------------------ - ---------------- - - ---------------- - ----- - ---- - ------------------------------------- - --- ---------------- -- -- - ---------------------- -- ---- ---------- ---
在这个示例应用程序中,我们使用了 express
,创建了三个路由:
/
:这个路由仅包含一个链接,它将重定向到/login
路由。/login
:使用 SAML 进行验证,并将用户重定向到/
路由。/pteotected
:这个路由是需要身份验证的,如果没有验证,将返回 401 状态码。
我们将匹配 SAML 响应的函数放在了 /sso/callback
路由中。
使用 SAML 进行身份验证的流程如下:
- 用户单击
/login
链接,网站构建 SAML 请求,并将其重定向到 SSO 服务器。 - SSO 服务器验证用户并需求其输入凭证。
- 如果用户验证通过,则 SSO 服务器将响应 SAML 响应到
http://localhost:3000/sso/callback
,并指向正确的重定向地址。 - 网站解析 SAML 响应,将用户 ID 存储在本地,并将其重定向到保护页面。
- 对于
/protected
路由,如果用户没有会话或会话中没有有效的用户 ID,则返回 401。
运行示例应用程序
将以下内容添加到保存为 Dockerfile
的文件中:
FROM node:12-slim WORKDIR /app COPY package*.json ./ RUN npm install --only=production COPY . . EXPOSE 3000 CMD [ "node", "index.js" ]
构建 Docker 镜像:
docker build -t samlexample .
启动容器:
docker run -p 3000:3000 --name=samlexample samlexample
在浏览器中打开 http://localhost:3000
,您将看到 "Login" 的链接,单击后输入凭证进行测试。输入验证通过的凭证,将被重定向到 "http://localhost:3000/protected",并看到 "Hello, your_name!" 的文本。如果未进行验证,则返回 401。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6006710a8dd3466f61ffe030