Angular:仅在授权的情况下(使用JWT)从服务器加载延迟加载的模块

时间:2018-07-25 18:17:52

标签: javascript angular typescript jwt

我在我的角度应用程序中使用了延迟加载的模块,直到现在一切正常。

现在我有一个关于保护的特定问题,但尚未找到答案。 您将有机会使用Angular Guard和“ CanLoad”“保护”惰性加载的模块。但这仅在前端,因此即使不允许用户查看ist,也可以绕过它并加载模块。例如管理区。

我正在使用JWT进行授权,并且所有数据都托管在与托管Angular App的应用程序服务器完全隔离的Azure后端上。

我现在正在考虑是否有任何方法可以使用JWT进行验证,并检查该用户服务器端是否允许加载当前模块。

例如,您具有以下模块:

  • 功能A
  • 功能B
  • 功能C
  • 管理员

在JWT中,对于每个功能模块/区域,有效负载中都有一个变量,该变量指示是否允许用户使用此功能(是/否)。

现在,如果用户尝试为功能A加载延迟加载的模块,我想用公共密钥验证应用程序服务器上的JWT,以知道“此密钥有效,并且与天青服务器”。

接下来,它将检查FeatureA的变量是否设置为true。如果是这样,我将模块(js-chunk文件)返回给客户端。如果没有,我将返回403禁止访问。

因此,即使修改了应用程序,该人也只有在具有有效JWT的情况下才能获得功能模块,该功能表明该功能已为该用户激活。

有没有办法做到这一点?我不知道从哪里开始寻找解决方案。因此,如果有人能告诉我我如何获得它以及我需要什么,我将非常感激!

预先感谢

Sazeidya。

2 个答案:

答案 0 :(得分:0)

...然后另一个开发者为另一个战车发明了另一个轮子...

首先,Webpack jsonp function接收到延迟加载的模块(如果我们正在谈论的是内部使用Webpack的Angular CLI),默认情况下,该模块只是将另一个脚本注入页面;这意味着您几乎没有机会通过此请求传递令牌,因为它是作为脚本而不是XHR加载的。将令牌添加为get参数也将是一个安全问题,因此我认为这也不是一个选择(即使可以实现)。

让我们假设,您可以更改Webpack加载块的方式(例如,编写一个可以满足您需要的自定义服务工作器,但我不确定是否可以轻松完成)。然后我们问一个问题:

您为什么需要保护admin(或其他任何模块)模块?

这只是一段代码。如果您在此模块中有一些敏感内容,那么这就是您的体系结构问题。所有敏感数据都应来自API。

您唯一需要保护的是从应用程序中使用的管理API。每个调用都应针对该调用提供的令牌进行验证。如果用户在令牌中具有正确的scope(或用于授权的任何内容),则请求应返回数据,否则返回403。差不多。

答案 1 :(得分:0)

解决方案

这完全取决于您的后端。

由于 Angular 前端文件只是某些服务器提供的静态文件,这取决于:

  1. 您可以区分模块的文件
  2. 为您的前端文件提供服务的应用程序可以基于某种身份验证/授权允许/阻止对选定文件的访问

广告 1

这对 Angular 来说没有问题。您必须使用以下标志 [1] 构建您的项目:

ng (...) --named-chunks=true (...)

这将生成具有以下名称的模块 js 文件:

your-module.<hashNumber>.js

广告 2 - Spring Boot 解决方案

在我当前的项目中,我们使用 (Java) Spring Boot 为应用程序前端和后端提供服务。我们正在使用 spring-security 登录表单登录应用程序。它创建会话并在 cookie 中跟踪此会话。 Cookie 会在每次请求时发送到后端 - 也在加载惰性模块时发送。在后端,您将会话与用户角色相关联。这让您可以允许用户根据登录的用户和具有适当角色的用户下载 Angular 模块。

广告 2 - 云 (AWS)

由于我不熟悉 Azure,但我有一些 AWS 背景,我可能会尝试描述一些基于 AWS 的解决方案,这些解决方案应该可以移植到所有主要的云提供商。

如果您使用云提供商身份验证和授权系统(如 AWS Cognito),那么您应该能够保护对您的访问:

a) 存储(如 S3)或

b) 在 VM(如 EC2)上提供的应用程序。

在第一个条件 (a) 中,您可以根据某种 policies(资源访问限制器)和 authentication system groups(例如 Cognito)设置访问选定模块(JavaScript 文件)的策略.

在第二个条件 (b) 中,这取决于您的后端。上面描述了简短的 Spring Boot 解决方案。

为什么需要保护模块?

最好不要将代码的任何脆弱部分放在前端应用程序中,但即使您可能在代码中提供某种可能会利用进一步攻击(例如社会工程攻击)的信息。因此,通常最好尽可能地缩小权限,并在用户需要的情况下尽可能少地允许他们。

来源

[1] https://angular.io/cli/build