Express.js 的 Restful API 身份验证和会话管理

Posted

技术标签:

【中文标题】Express.js 的 Restful API 身份验证和会话管理【英文标题】:Restful API Authentication and Session management for Express.js 【发布时间】:2014-07-26 15:02:53 【问题描述】:

我一直在研究 RESTful 身份验证,但我仍然没有很清楚的想法,我该如何设计我的 Web 架构。我有很多问题没有答案。

我希望我的 API 也可以用于移动和网络,我正在使用 Express v4。

我不想使用基本身份验证,因为许多帖子都建议作为一种简单的出路,或者我可以使用 Passport 中间件,但我想使用基于令牌的身份验证或类似或更好的东西,我想进行身份验证,以便我可以更好地理解,但我不确定如何实现。

我将在下面简化我的预期身份验证架构:

新用户注册

客户端

将用户名和密码发布到服务器 (我知道如果你想使连接安全是使用 https 连接,否则我将公开我的凭据,或者你有除 https 之外的任何其他选项?否则我将需要使用带有时间戳和哈希的公钥和私钥在发送到服务器之前我的凭据?我该怎么做?还有其他更好的选择吗?

服务器端

使用salt加密算法对密码进行哈希处理,并将哈希后的密码和salt存储起来,然后生成一个token ID并发送给客户端,token ID存储在session中还是使用REDIS数据库?

使用会话不是又违反了 REST 吗?但是,如果我不使用会话,如何存储令牌 ID 并与客户端进行比较?

客户端

既然我有了token ID,我该如何在客户端存储呢?

    我应该使用cookie吗?如果是,这会违反 RESTful 吗?我的移动应用程序如何也存储 cookie? 除了 cookie 我还有哪些其他选择?我想不出来。

授权 API

客户端

现在,我有了令牌 ID,每次我想向服务器发出请求时,我都会把它放在授权标头中。

服务器端

当收到请求时,服务器会检查token API,并与会话token进行比较,如果为真,则请求允许否则拒绝

这是 Express 应用授权的标准方式吗?

很抱歉发了这么长的帖子,但我觉得我应该真正掌握身份验证和授权,因为它很重要。我确实希望有人能纠正我对 REST 身份验证的误解并回答我的问题或建议我更好的方法。

【问题讨论】:

我目前正在为同样的问题而苦苦挣扎 - 您是否知道如何以流畅透明的方式实现这一点?有没有办法优雅地剥离所有请求的令牌,以便 API 可以专注于只提供请求的数据?理想情况下,可以将身份验证和授权放在一个中间件中,该中间件在实际 API 之前执行。如果你能花时间解释你最终得到的解决方案,我会很高兴 【参考方案1】: 发送通过 https 编码的用户凭据 要在客户端比较令牌,您可以将其保存在地图中或与用户 ID 对应的 Redis 存储中,并匹配它以认为用户已通过身份验证。它不会像在 Rest 中那样扼杀 Rest 的重要性,而且授权令牌是仅在到期后的会话 Express 没有任何特定或标准的授权方法,它只允许您使用后端的任何数据库来执行应用程序需要的身份验证和授权

【讨论】:

cookies怎么样,必须在客户端使用来存储token ID??如果您使用 cookie,我如何在移动应用程序中使用该 cookie?我希望你能解决我上面发布的一些问题! 这是一个非常好的问题...而且我想知道有关使用需要通过 API 进行身份验证的本机应用程序的移动设备的管理会话的答案。我认为我将使用的一种方法是将信息直接存储在提供给客户端的令牌中。我遵循了本指南 (thejackalofjavascript.com/architecting-a-restful-node-js-app) 正如您所见,令牌是由 Javascript 对象的加密生成的,您可以在其中保存到期日期和一些用户信息。在这种情况下,也许不需要会话。【参考方案2】:

您的解决方案是使用 JWT 令牌进行身份验证。您可以在 https://medium.com/dev-bits/a-guide-for-adding-jwt-token-based-authentication-to-your-single-page-nodejs-applications-c403f7cf04f4 阅读有关 JWT 的更多信息

使用 JWT 令牌,您可以拥有一个令牌基础身份验证系统,在 cookie 中没有会话 UID,但您必须实现逻辑来处理已注销的令牌,例如黑名单令牌。

【讨论】:

以上是关于Express.js 的 Restful API 身份验证和会话管理的主要内容,如果未能解决你的问题,请参考以下文章

使用 passport.js 和 express.js (node.js) 制作安全的 oauth API

无法从使用 Express.js 和 SQL Server 创建的 api 获得任何响应

如何使用 Express.js 将 API 访问限制为仅授权域?

如何在 Express.js 服务器上执行 JWT API 请求? (edX API)

React 前端 + Express.js 会话

每次在 Node.js (Express.js) 中发出 API 请求之前,如何简化 Fetching Auth token?