在面向现代 Web 应用开发的过程中,用户身份认证是必不可少的一环。passport-honeywell
是一个基于 Passport 的身份认证中间件。它适用于 Honeywell 的 OAuth 2.0 认证,和其他 OAuth 2.0 认证方式不同的是,Honeywell 要求应用程序是基于 SAML2 的。
本文将带您深入了解 passport-honeywell
的功能和用法,帮助您在开发中优雅地解决用户身份认证的问题。
安装
passport-honeywell
是一个 npm 包,因此您需要在项目中安装它:
npm install passport passport-honeywell
基本用法
使用 passport-honeywell
非常简单。您可以参考下面的示例代码:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ----------------- - --------------------------------------- ------------- --- ------------------ - ------------ --------------------------- --------------- -------------------------------- ----------- -------------- -- ------------- ------------- -------- ----- -- - -- -- ----- --------- ------- ---------- --------- - - -- -------------------------- ------------------------------------ -------- --------------------------- ---------------------------------- - ---------------- -------- --- ----- ---- -- - ------------------ - --
在这个示例中,我们首先导入了 passport
和 passport-honeywell
这两个模块。然后,我们定义了 HoneywellStrategy
。这个策略的构造函数需要传入一个对象,它包含以下属性:
callbackURL
:当用户完成 Honeywell 认证流程后,Honeywell 会将用户重定向到这个地址。通常这个地址应该是您应用程序的一个后端接口,由后端接口进行登录处理。samlEntryPoint
:SAML2 跳转页面的地址,也称为 SSO 系统的地址。应用程序需要按照 Honeywell 的认证流程,使用 SAML2 认证后才能获得 OAuth 认证。samlIssuer
:这个字段用于设置应用程序的标识,这个标识需要和 Honeywell 系统中的 SSO 系统的标识一致。
构造函数的第二个参数则是一个回调函数,此函数被调用时,OAuth 2.0 认证流程已经完成。您可以在适当的时候将 OAuth 认证接口返回的数据保存到数据库或 session 中,然后调用 done
函数通知 Passport 认证流程已经结束。
接下来,我们注册了两个路由:
/auth/honeywell
:这个路由中间件会重定向用户到 Honeywell 的认证页面。/auth/honeywell/callback
:当 Honeywell 认证流程完成后,Honeywell 会将用户重定向到这个路由。在这个路由中间件中,Passport 会将 OAuth 认证相关的信息保存在req.user
对象中,并重定向用户到应用程序的主页面。
至此,passport-honeywell
的基本用法已经介绍完毕。接下来,我们将进一步讨论其中的细节。
配置选项
HoneywellStrategy
构造函数的第一个参数是一个配置对象,这个对象可以包括以下属性:
callbackURL
:当用户完成 Honeywell 认证流程后,Honeywell 会将用户重定向到这个地址。通常这个地址应该是您应用程序的一个后端接口,由后端接口进行登录处理。samlEntryPoint
:SAML2 跳转页面的地址,也称为 SSO 系统的地址。应用程序需要按照 Honeywell 的认证流程,使用 SAML2 认证后才能获得 OAuth 认证。samlIssuer
:这个字段用于设置应用程序的标识,这个标识需要和 Honeywell 系统中的 SSO 系统的标识一致。scope
:这个字段用于设置 OAuth 2.0 认证时请求的权限范围。默认为["openid", "profile", "email"]
。authorizationURL
:用于 OAuth 2.0 认证的authorization_endpoint
地址。如果为空,则默认为 Honeywell 的 OAuth 2.0 认证地址。tokenURL
:用于 OAuth 2.0 认证的token_endpoint
地址。如果为空,则默认为 Honeywell 的 OAuth 2.0 认证地址。skipUserProfile
:是否跳过请求用户信息的步骤。如果为true
,则不会请求用户信息。默认为false
。sessionKey
:保存用户信息的 session 键名。默认为passport.user
。state
:这个字段用于设置 OAuth 2.0 认证时传递的state
参数。如果设置了这个参数,则需要在回调函数中校验 state 是否匹配。
注意事项
在使用 passport-honeywell
进行用户身份认证时,需要注意以下几个问题:
需要设置 samlEntryPoint
Honeywell 系统的认证方式是基于 SAML2 的,而不是标准的 OAuth 2.0。因此,我们需要向 Honeywell 提供一个 SAML2 跳转页面的地址,也称为 SSO 系统的地址。对于一个新的 Honeywell 应用程序,您需要向 Honeywell 咨询如何设置这个地址。
需要设置 samlIssuer
除了 SAML2 跳转页面的地址之外,我们还需要向 Honeywell 提供一个应用程序的标识,这个标识需要和 Honeywell 系统中的 SSO 系统的标识一致。对于一个新的 Honeywell 应用程序,您需要向 Honeywell 咨询如何设置这个标识。
使用 passport.deserializeUser
函数加载用户信息
如果您在项目中使用了 passport.deserializeUser
函数来从数据库或 session 中加载用户信息,那么在完成 OAuth 认证后,这个函数将会被自动调用。您需要在回调函数中将 OAuth 认证接口返回的数据保存到数据库或 session,以便后续使用。
passport.deserializeUser((user, done) => { // 从数据库或 session 中加载用户信息到 req.user done(null, user); });
计算令牌签名时请注意参数的字典序
在调用 Honeywell 的 OAuth 2.0 接口时,需要计算令牌签名。计算签名时,需要注意参数的字典序,否则签名将会失败。
-- -------------------- ---- ------- ----- ----------- - ----------------------- ----- --- - --------------- ----- ---------- - ----------------------- -------- ------------ - ----- ------------ - ------------------- --------- -- -- ------------------- ------------- ---- -- -- ------- ------ ----------- --- ---- ----- ---------------- - ------------------------------------ ----- --------- - ----------------------------------------------------- ------ - ---------- --------- -- -
在这个示例中,我们使用了 querystring
和 md5
模块计算令牌签名。由于字典序的影响,我们需要使用 Object.keys(params).sort()
函数将参数按字典序排序,然后再进行签名计算。
结语
在本文中,我们介绍了 passport-honeywell
这个基于 Passport 的身份认证中间件。通过使用 passport-honeywell
,您可以快速、方便地实现 Honeywell OAuth 2.0 认证。同时,我们还介绍了一些使用 passport-honeywell
需要注意的问题,希望本文能够对您在开发中解决 OAuth 认证问题有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600560b381e8991b448def6b