Javascript dojo web应用程序身份验证

Javascript dojo web应用程序身份验证,javascript,ajax,authentication,dojo,Javascript,Ajax,Authentication,Dojo,我正在尝试使用Dojo开发一个纯javascript web应用程序。我面临的问题是限制对应用程序部分的访问。经过身份验证的用户应该能够访问所有内容,而未经身份验证的用户应该只能访问登录屏幕 问题是,没有任何东西(我知道)会阻止用户打开浏览器javascript终端并输入类似以下内容:app.displayRestrictedContent(),从而获得针对经过身份验证的用户的屏幕访问权限 我已经实现了一个基于ajax的登录;所有ajax调用都由一个会话保护。因此,虽然未经身份验证的用户可以加载

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

问题是,没有任何东西(我知道)会阻止用户打开浏览器javascript终端并输入类似以下内容:
app.displayRestrictedContent()
,从而获得针对经过身份验证的用户的屏幕访问权限

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


我想做不可能的事吗?编写诸如
if(user.auth)app.displayRestrictedContent()之类的代码似乎很愚蠢当它很容易规避时。这让我相信我错过了其他人都很明显的东西。我根本找不到关于纯基于javascript的应用程序和身份验证模型的太多信息。

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

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


我绝对不是专家,但这里是我对此的一些想法。我不认为您遗漏了什么(如果是的话,我也遗漏了)——我认为这是所有客户端应用程序的一个非常基本的问题,无论是编译后的可执行文件还是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都放在一个构建层中,应用程序的加载速度可能会稍快一些。当然,制作图层的细微差别也是有限度的。更多的层意味着更多的麻烦,但也意味着更细粒度的模块访问

我很想听到其他人也参与进来。这是个好问题

But still, It seems wrong for this screen to be arbitrarily accessible.
因为这是客户端代码。用js编写的任何东西,或者编译成js,都希望用户能够阅读

Am I trying to do the impossible?

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

谢谢,我对会话有一定的了解。这个问题直接关系到Javascript应用程序的客户端性质,以及非授权用户如何访问受限区域。这就是我所说的。在客户端,您可以保留一个会话标识符,用于对自己进行身份验证。在服务器端,您根据提供的会话标识符授权对资源的访问(这需要在服务器端完成-客户端不可信)。(顺便说一句,我不认为公认的答案与身份验证有什么关系——它只讨论dojo构建系统,而且很容易处理压缩的Javascript)答案提供了使用dojo开发Javascript应用程序的见解,这也是我正在做的。答案以一种特定的方式回答了我的问题。问题是,构建系统与构建dojo应用程序完全正交。您首先正常构建应用程序(并且已经进行了身份验证),然后才可以使用构建系统将您已经运行的应用程序转换为另一个更优化的版本。顺便说一句,后端是通过cakePhp实现的。您能否进一步介绍用于将js资产返回浏览器的分层和身份验证系统?