带有RESTful API的本地存储,用于用户身份验证。这是一种安全的方法吗?

时间:2018-10-21 05:36:22

标签: php json reactjs authentication restful-authentication

对于以下是否是一种安全的用户身份验证方法,我真的要提出一些意见,如果不是,请指出它的缺点。

  • React前端
  • PHP / MySQL在远程服务器上基于RESTful API

1)用户注册,将数据发布到API,通过电子邮件向用户发送一次使用激活链接,以确保电子邮件有效,然后才能访问其帐户。

2)用户登录,API以所有常用方式验证数据,然后发送回包含其用户ID和访问令牌的JSON对象。

3)接收到数据后,在用户设备上的localStorage中设置用户ID和访问令牌。然后,React从localStorage获取数据,并使用它来设置和控制Redux存储中的状态,从而提供应用范围内的Auth状态。

4)用户ID和访问令牌与将来对API的每个请求一起发送。在用户未登录的情况下,即-他们没有提供带有匹配令牌的有效用户ID,则会自动阻止他们在API的第一个入口点请求任何需要身份验证的请求。适当的响应会被发回,从而更新前端状态以反映未登录的用户。

5)用户注销后,访问令牌将从localStorage中删除。

有关一些内部工作原理的更多细节:

  • 所有令牌都是在服务器端生成的,并存储在数据库中,它们是随机且唯一的bin2hex(random_bytes(32)),仅在提供匹配的用户ID时才有效。因此,更改请求中的用户ID会导致身份验证响应失败,以及提供带有不匹配或过期令牌的有效用户ID。

  • 令牌是一次性的,并且会生成,存储新的令牌,然后从每个已认证的请求中将其与相应的用户ID一起发送回响应中。这可能会过大,并给服务器带来很多额外的压力。真的很希望您对此方面的意见。

  • 令牌设置为在2小时内过期。因此,如果用户让自己保持登录状态,那么他们将在闲置2小时后自动退出。

  • 用户ID和令牌作为每个请求的JSON主体的一部分发送(不在标头中)。这是否值得关注?

  • 在任何时候(除了注册和登录),用户密码都不会在localStorage中传输或存储或由React前端使用。初始授权后,验证用户所需的全部是匹配的用户ID和令牌。

  • 所有连接都是通过HTTPS建立的。

您可以通过这种方法发现任何明显的安全风险吗?我想念这里房间里的大象吗?

很明显,就身份验证而言,用户ID和匹配令牌与在每个请求上为用户提供电子邮件和密码一样好,但是我不能使用PHP会话或cookie *,因为API托管在其他域中。这是我无需沿JWTOauth路线就能想到的最好的解决方法。

在这里无法实际解决我在API上检查和验证数据的方式可能有多严重,但是假设一切都正确完成,此方法原则上是否足够安全?

我期待着并感谢您的意见:)

*没有大量的变通办法,最终这将是多余的,因为此应用只能与都支持localStorage的现代浏览器一起使用。

1 个答案:

答案 0 :(得分:0)

我认为没有将令牌存储在本地商店中

https://auth0.com/docs/security/store-tokens

中所述

由于浏览器的本地存储(或会话存储)不安全。那里存储的任何数据可能容易受到跨站点脚本的攻击。如果攻击者窃取令牌,则他们可以访问您的API并向其发出请求。将令牌视为信用卡号或密码:不要将其存储在本地存储中。

更好的选择是使用cookie,因为它们是由浏览器管理的。