0

我正在尝试制作网站的后端 API(我想让后端独立于前端,所以我现在只制作服务器端 API,尽可能遵守 RESTful)。我以前没有这样做过,所以我不知道“最好”和最安全的做事方式。

我现在怎么做:

API 的某些部分只能在特定用户登录后和最多 24 小时后访问。

为此,每当用户登录时,我都会在服务器端生成一个随机会话 ID(我使用的是无密码登录,因此当用户单击电子邮件中的链接时会分配该 ID),服务器端会通过发送该 ID 来响应客户端一次的会话 ID。然后,客户端将此会话 ID 存储在本地存储中(如果客户端不是 Web 浏览器,则存储在磁盘中的文件)。

接下来,我将该 ID 与关联的电子邮件一起存储在服务器端的数据库(MySQL 表)中。

现在,每次客户端想要从我的 API 中获取某些东西时,他们都必须在 URL 中提供电子邮件和会话 ID(我现在不需要 cookie),服务器会检查数据库中的那些,如果它们存在,那么服务器完全响应,否则响应错误。

24 小时后,服务器删除电子邮件/会话 ID 对,用户必须再次登录(以生成另一个会话 ID 并将其与他们的电子邮件相关联)。

现在的问题:

  1. 我的方法是安全的还是有明显的漏洞?还有另一种我不知道的经过实战考验的方式吗?

  2. 客户端是否有更好的方法来存储会话 ID(如果它们是 Web 浏览器)?

  3. 生成唯一会话 ID 的最佳方法是什么?目前我生成了一个随机的 16 字符字符串,我将其设置为会话电子邮件表的主键。

  4. 使用 MySQL 表是存储会话 ID 的最高性能/最佳方式吗(假设每个请求都会查询它)?

  5. 我是否需要以任何方式加密会话 ID?客户端将其作为“裸”URL 参数发送是否安全?

很抱歉在一篇文章中有太多问题,但我认为它们与上述单一场景有关。如果有什么不同,我正在使用 F#,我希望我的客户端是一个 android 应用程序或一个 Web 应用程序。

4

1 回答 1

0

您的 REST API 必须不知道任何关于 REST 客户端会话的信息,甚至不知道会话 ID。如果您不想在每个请求中都发送密码,您所能做的就是对用户 ID 和超时时间进行签名,以便服务可以根据签名进行身份验证。使用 JSON 网络令牌:https ://en.wikipedia.org/wiki/JSON_Web_Token

你可以有一个服务器端 REST 客户端,它可以有你描述的会话。问题是,开发 REST 服务而不是常规 Web 应用程序真的值得吗?我不确定您的情况,但通常答案是否定的,因为您不会有任何 3rd 方 REST 客户端,并且您的应用程序没有足够的流量来证明分层架构的合理性,或者它不足以拆分为多个进程, ETC...

如果安全很重要,那么您必须使用真正的随机生成器算法或硬件。https://en.wikipedia.org/wiki/Random_number_generation#.22True.22_vs._pseudo-random_numbers通过 HTTP 发送任何东西是不安全的,您必须使用 HTTPS。您必须使用标准授权标头而不是查询参数。https://en.wikipedia.org/wiki/Basic_access_authentication

于 2016-09-28T10:16:26.230 回答