对于以下是否是一种安全的用户身份验证方法,我真的要提出一些意见,如果不是,请指出它的缺点。
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托管在其他域中。这是我无需沿JWT或Oauth路线就能想到的最好的解决方法。
在这里无法实际解决我在API上检查和验证数据的方式可能有多严重,但是假设一切都正确完成,此方法原则上是否足够安全?
我期待着并感谢您的意见:)
*没有大量的变通办法,最终这将是多余的,因为此应用只能与都支持localStorage
的现代浏览器一起使用。
答案 0 :(得分:0)
我认为没有将令牌存储在本地商店中
如https://auth0.com/docs/security/store-tokens
中所述由于浏览器的本地存储(或会话存储)不安全。那里存储的任何数据可能容易受到跨站点脚本的攻击。如果攻击者窃取令牌,则他们可以访问您的API并向其发出请求。将令牌视为信用卡号或密码:不要将其存储在本地存储中。
更好的选择是使用cookie,因为它们是由浏览器管理的。