在每个请求中包含不记名令牌并保持用户登录

Ser*_*Ser 5 node.js jwt express-session

我有一个 API 在某个服务器上运行,当您向登录端点发送成功的请求时,它会为您提供一个 JSONWEBTOKEN。在我的第二台服务器上,我正在运行一个向 API 发送请求的网站。我想要的是保存用户登录时收到的 JWT 令牌,并保存它,以便用户的每个下一个请求也一起发送承载令牌,同时保持用户登录状态。

我尝试在请求中包含快速会话,使用

app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))
Run Code Online (Sandbox Code Playgroud)

但我在文档中找不到如何准确使用它来完成我需要的操作。

JRi*_*dsz 1

快速回答

我想要的是保存用户登录时收到的 JWT 令牌,并保存它

在您的 Web 服务器中,您创建令牌。所以你可以存储在任何地方(db)。当您需要诸如撤销令牌或停止特定用户的任何活动之类的功能时,通常需要这样做。因此,您的网络管理员删除该用户并标记电子邮件和/或令牌,因此当该用户执行新的 http 调用时,系统将显示“您不允许...”

如果您没有此功能,请勿将令牌存储在您的服务器中。只需创建它并发送给用户即可。常见的 javascript 框架会将此令牌存储在浏览器中的某个位置(例如localstorage),并且当需要调用 api 时,javascript 框架只会从 localstorage 获取令牌。

因此用户的每个下一个请求也会一起发送不记名令牌

如果您的前端有一个有效的令牌,您可以将它用于对 api 的每个下一个请求。

同时保持用户登录状态

这是另一个世界:从安全角度来看,强烈建议检测空闲用户并使其会话过期。

无论如何,如果您需要保持用户登录,我向您展示两种策略:

增加有效期(不推荐)

尽可能长地配置快速过期和令牌过期。

刷新

在您的 Web 服务器中创建一个端点,例如 /refresh。该端点将负责刷新您的 Web Express 服务器中的会话并刷新您的令牌(如果令牌已过期)。最后,使用 javascript(当前框架)的浏览器中的 web int 必须每隔一段时间就到达他的端点。这样您的会话和令牌将永远不会过期。

这也有助于检测空闲用户。例如,使用 JavaScript,您可以检测点击或其他事件。因此,在此事件中调用 /refresh 端点。活跃用户将拥有有效的 Web Express 会话和更新的令牌。空闲用户不会触发此点击事件,因此 /refresh 端点不会被调用。当用户欢迎并执行单击时, /refresh 端点将被调用,并且必须返回 flags ,指示 Web Express 会话已过期并且令牌也已过期。


外部化您的安全引擎

如果您有更多网站、API、移动应用程序等,请阅读本节

根据当今世界级平台的工作方式以及如果您有更多网站/api/等,我建议您使用 oauth2。

https://raw.githubusercontent.com/jrichardsz/static_resources/master/oauth/oauth-workflow.png

您与 api 中的 /login 端点更接近了。您的工件将是:

  • 安全服务器/引擎(管理身份验证和授权)
  • 应用程序编程接口
  • 网络

该安全引擎必须以最简单的方式具有两个端点:

/登录

将有效凭据交换为令牌

  • 网站、系统或应用程序不得在其中实现此逻辑。必须从其 Web 服务器后端(express)或使用 ajax 从浏览器中的 javascript 使用 /login。
  • 生成的令牌必须发送到网络。web 会将其发送到 api。

/验证令牌:

该端点负责检查令牌是否有效、签名是否正确、是否过期等

API,必须接收令牌并使用/validate-token检查其验证端点。如果 是有效令牌,api 必须执行请求的操作,例如列出客户、在数据库上保留值等。如果此端点返回错误,api 将向 Web 通知此错误,并且 Web 必须向用户显示错误。

如果您有 Api 网关,请在其上配置此端点,以便每次调用您的 api,api 网关都会执行传入令牌的验证。

Oauth2 需要很多其他端点

Oauth2 需要许多其他端点和功能,例如:所有应用程序的唯一表单登录、授予同意流程、刷新令牌、撤销令牌、用户管理等

最后,我的建议是开发自己的安全引擎,或者如果您没有时间(总是)搜索一些 oauth2 服务器或 oauth2 提供商并使用它!

检查这些 oauth2 文档或流程示例:

并检查我自己的 oauth2 提供程序: