【问题标题】:dojo web application authenticationdojo web 应用程序认证
【发布时间】:2011-10-24 04:26:33
【问题描述】:

我正在尝试使用 Dojo 开发一个纯 javascript Web 应用程序。我面临的问题是限制对应用程序部分的访问。经过身份验证的用户应该能够访问所有内容,而非经过身份验证的用户应该只能访问登录屏幕。

问题是(据我所知)没有任何东西可以阻止用户打开浏览器 javascript 终端并输入类似:app.displayRestrictedContent(); 的内容,从而访问专供经过身份验证的用户使用的屏幕。

我已经实现了基于 ajax 的登录;所有 ajax 调用都通过会话进行保护。因此,虽然未经身份验证的用户可以加载受限屏幕,但他们将无法为其获取数据。但是,这个屏幕随意访问似乎是错误的。

我是否正在尝试做不可能的事情?编写 if (user.auth) app.displayRestrictedContent(); 这样的代码似乎很愚蠢,因为它很容易被规避。这让我相信我错过了对其他人来说相当明显的东西。我根本找不到关于纯 javascript 应用程序和身份验证模型的太多信息。

【问题讨论】:

  • 顺便说一句,后端是通过cakePhp实现的。

标签: javascript ajax authentication dojo


【解决方案1】:
But still, It seems wrong for this screen to be arbitrarily accessible.

因为它是客户端代码。任何你用 js 写的东西,或者被编译成 js 的东西,都希望它能够被用户阅读。

Am I trying to do the impossible?

您可以在用户认证后动态加载 js 模块。因此,首先,只需加载 1 个登录模块。当用户登录时,如果成功,服务器返回一个要加载的js模块列表,如果没有,返回空列表。它还有助于缩短用户访问您网站时的加载时间。

【讨论】:

    【解决方案2】:

    我绝不是专家,但以下是我对此的一些想法。我不认为你错过了任何东西(如果是这样,我也有) - 我认为这是所有客户端应用程序的一个非常基本的问题,无论它是编译的可执行文件还是 Javascript。

    当然,编译后的可执行文件并没有受到特别的阻碍,因为它被制成机器代码,很难阅读或反编译成任何有用的东西。然而,使用 Javascript,应用程序通常完全按照您编写的方式提供服务,因此很容易修改和推理。

    这让我想到了第一个半解决方案:混淆您的 Javascript。如果您使用 Dojo 的构建工具和 shrinksafe 参数,所有不必要的空格都会被删除并且所有的标识符都会被缩短,使得代码很难阅读。我称这是一个半解决方案,有些人可能会说即使这样也给了它太多的信任——我自己仍然认为它值得做。毕竟,压缩后的代码下载速度也更快!

    我在应用程序中采取的第二个措施是将不同的部分分成“构建层”。例如,在我的构建配置文件中,我会有类似

    dependencies = {
        ..
        layers: [
            { name: "../myApp/Core.js", resourceName: "myApp.Core",
              dependencies: ["myApp.Core", "myApp.Foobar"] 
            },
            { name: "../myApp/modules/Login.js", resourceName: "myApp.modules.Login",
              dependencies: ["myApp.modules.Login", "myApp.modules.LoginUi"...],
              layerDependencies: ["../myApp/Core.js"]
            },
            { name: "../myApp/modules/Secret.js", resourceName: "myApp.modules.Secret",
              dependencies: ["myApp.modules.Secret", "myApp.modules.SecretUi"],
              layerDependencies: ["../myApp/Core.js"],
              authentication: 42
            }
        ]
    }
    

    现在,我不再将构建的 JS 文件直接作为静态文件提供服务,而是让请求通过服务器端应用程序中的控制器,该控制器检查 JS 层是否需要身份验证以及用户是否登录必要的访问权限。

    这确实有一些缺点。 JS 文件没有被缓存,如果我将所有的 JS 放在一个构建层中,应用程序的加载速度可能会稍微快一些。当然,制作图层的细微差别也是有限度的。更多的层意味着更多的麻烦,但也意味着更细粒度的模块访问。

    我也很想听听其他人对此的看法。这是个好问题。

    【讨论】:

    • 您能多谈谈用于将 js 资产返回浏览器的分层和身份验证系统吗?
    【解决方案3】:

    当用户成功登录时,服务器应该为他提供一个会话令牌。之后,每当用户请求资源(通过仅重定向浏览器或通过 AJAX)时,他都会向服务器显示他的会话令牌(通过将其存储在 cookie 中并在所有请求时自动发送或通过在正文中显式传递AJAX 请求)

    然后服务器可以使用来自用户的会话令牌来控制服务器端的授权,拒绝任何带有无效或过期令牌的请求。

    https://en.wikipedia.org/wiki/HTTP_cookie#Session_management

    【讨论】:

    • 谢谢,我对会话有一定的了解。这个问题与 Javascript 应用程序的客户端性质以及非授权用户如何访问受限区域直接相关。
    • 我就是这么说的。在客户端,您可以保留一个会话标识符,您可以使用该标识符对自己进行身份验证。在服务器端,您根据提供的会话标识符授权对资源的访问(这需要在服务器端完成 - 客户端不能被信任)。 (顺便说一句,我看不出接受的答案与身份验证有什么关系——它只讨论了 dojo 构建系统,并且非常容易解决压缩的 Javascript)
    • 答案提供了使用 Dojo 开发 javascript 应用程序的洞察力,这也是我正在做的事情。答案以特定的方式解决了我的问题。
    • 问题是,构建系统与构建道场应用程序是完全正交的。您首先正常构建应用程序(并且已经通过身份验证),然后才能使用构建系统将您已经运行的应用程序带入另一个更优化的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2012-02-05
    相关资源
    最近更新 更多