【问题标题】:Authenticate requests from frontend that doesn't have tokens验证来自没有令牌的前端的请求
【发布时间】:2021-08-31 15:12:57
【问题描述】:

不确定标题是否很好地概括了我的问题。

基本上,我正在尝试验证路由,例如检查用户是否存在等。我只想允许 来自我的前端应用程序的请求得到批准,但是,由于没有用户登录,因此没有要发送的令牌。

API 请求 -

mywebiste/checkUser/email

此路由在我的后端不受保护,因为没有用户登录。 但我想保护这条路线,使其只能从前端访问。

我想出的一些想法是从前端添加特定的标头标签并在后端检查它们,但这可以很容易地复制,是否有更安全的东西,比如使用令牌等。

我正在使用 React 和 Node.js

【问题讨论】:

    标签: javascript authentication jwt token


    【解决方案1】:

    我最终创建了一种可行的解决方案,所以基本上,我在前端创建了一个新的 base64 字符串,并在向后端发出请求时将其附加到标头。 base64 字符串每分钟都不一样,所以即使复制了标头,它也每分钟都不同,并与您的密钥组合在一起。

    我已经制作了一个包,以便人们可以根据需要使用它 - https://github.com/dhiraj1site/ncrypter

    你可以这样使用它

    var ncrypter = require('ncrypter');
    
    //use encode on your frontend with number of seconds and secret key
    var encodedString = ncrypter.encrypt(2, 'mysecret1')
    
    //use decode on your backend with same seconds and secret
    var decodedString = ncrypter.decrypt(encodedString, 2, 'mysecret1');
    
    console.log('permission granted -->', decodedString);
    

    【讨论】:

    • 这样做的问题是不能保密。
    • 你说得对,不幸的是,它远未完全安全,但我认为比发送静态标头更好
    【解决方案2】:

    您可以验证请求是否由用户发起(通过对其进行身份验证),但由于以下两个原因,您无法验证请求是否来自特定客户端:

    • 如果您在客户端(网页或其他)中包含一些 API 密钥,那么每个人都可以轻松检索它(您可以做的最好的事情是混淆它,这会使事情变得稍微困难​​但仍然可能)
    • 如果您通过网络发送 API 密钥,它也很容易检索

    您唯一能做的就是阻止其他网页代表用户调用您的后端,方法是使用CORS(如果您不指定Access-Control-Allow-Origin 标头,默认情况下它实际上是活动的)

    【讨论】:

    • 但是如果我是正确的,CORS 不会保护从服务器发出的调用,例如 curl,它只保护浏览器?
    • 没错,它只是一个网络事物,通过防止恶意网页尝试调用您的后端来保护您的用户(而不是您的后端)
    • 这是有道理的,但我希望能够保护它免受每个请求的影响,这样我数据库中的电子邮件列表就不会被泄露
    • 不幸的是,这是不可能的,您必须为此对用户进行身份验证。请记住,后端只是一个返回 JSON 而不是 HTML 的网站,因此它公开的所有内容都可供任何人免费使用。
    • 是的,这不是一个大问题,因为前端 UI 确实告诉后端相同的事情,只是想知道是否有这样做的方法,我想适当地构建您的应用程序是答案
    【解决方案3】:

    Same origin policy 将为您提供一些基本保护,但基本上如果 API 端点公开公开,它就会公开公开。如果您不希望该路线可公开访问,则需要添加访问控制。

    如果您使用该路由来检查用户是否已注册,例如,您可以将其与用户注册路由合并,并在用户已经存在时发送不同的错误代码(这不是一个好主意,因为它泄露在您的系统上注册了哪些电子邮件)。

    【讨论】:

    • 这就是我目前正在做的事情,如果用户存在则发送 200,如果不存在则发送 404,但这并不能解决问题,因为尽管有来源,它仍然会发送有效响应。如果来源是由请求标头描述的,那么也可以很容易地复制
    • 如前所述,公共 API 是公共的。如果您有 /mywebiste/register 之类的端点,客户端可以将电子邮件地址和密码发送到那里,如果用户已注册,您可以发送特殊代码,例如 409。
    猜你喜欢
    • 2020-11-09
    • 2020-09-09
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2013-04-11
    • 2021-09-17
    相关资源
    最近更新 更多