与SystemJS加载程序一起使用时,ADAL库会受到损坏 - ReferenceError:未定义AuthenticationContext

时间:2016-01-31 21:04:59

标签: angularjs adal systemjs jspm

我使用Angular1构建了一个小型测试应用程序,该应用程序使用ADAL连接到Office365租户。由于我希望开始包含Angular2组件,我尝试使用JSPM和SystemJS加载我的模块,根据angular.io上的示例。

我正在为遇到同样错误消息的任何人提供以下信息:

Uncaught Error: [$injector:modulerr] Failed to instantiate module app due to:
ReferenceError: AuthenticationContext is not defined

我花了几个小时才弄清楚出了什么问题,盲目地踩着ADAL代码。 ADAL.js文件依赖于它在全局命名空间中声明AuthenticationContext,并在将文件加载到“模块”时使用SystemJS包,它现在将其隐藏在依赖于它的另一段代码中。

我想微软可以更好地打包它的代码 - 理想情况下把它变成NPM包(而不仅仅是支持Bower),但我真的不知道如何解决这个问题......

为了获取文件,我使用了jspm命令,例如:

jspm install angular
jspm install github:azuread/azure-activedirectory-library-for-js

使用适当的依赖关系干净地填充我的package.json,允许轻松地在另一台开发机器上安装。

当我使用Microsoft提供的示例时,他们只是使用HTML中的脚本标记静态加载javascript文件。 SystemJS在开发和生产方面使它变得更加简单,因为它在运行时动态加载。但是,当我依赖下面主应用程序代码中的import语句时,SystemJS似乎将adal.js中的代码包装在“模块”中,因此它有效地隐藏了以前存在于全局范围内的变量。这会导致错误,因为全局未定义变量AuthenticationContext。

我的主要应用代码如下:

import 'angular';
import 'azuread/azure-activedirectory-library-for-js/dist/adal.min';
import 'azuread/azure-activedirectory-library-for-js/dist/adal-angular.min';
var app = angular.module('app', ['AdalAngular']);

app.config(
['$httpProvider', 'adalAuthenticationServiceProvider', function
( $httpProvider,   adalProvider) {

  var endpoints = {
    "https://login.microsoftonline.com": "56fc9778-8aac-45d2-9305-b9171ffafa8/oauth2/authorize"
  };

  adalProvider.init(
      {
        tenant: '56fc9778-8aac-45d2-9305-b9171ffafa8',
        clientId: 'ace0c960-c792-4620-884e-9029ba16b61',
        endpoints: endpoints
      },
      $httpProvider
  );
}]);
export {app};

2 个答案:

答案 0 :(得分:1)

我的修复只是在我的代码中注释掉第二行:

//import 'azuread/azure-activedirectory-library-for-js/dist/adal.min';

要获取代码,我只需要在我的index.html文件中使用脚本标记手动加载它,该文件引用Microsoft提供的CDN

<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.0/js/adal.min.js"></script>

这不是超级干净,但它有效。

答案 1 :(得分:1)

您应该只能将adal导出为AuthenticationContext。我已经测试了以下systemjs配置,它对我有用。

meta: {
  'node_modules/angular/angular.js': { format: 'global', exports: 'angular' },
  'node_modules/adal-angular/dist/adal.min.js': { format: 'global', exports: 'AuthenticationContext' },
  'node_modules/adal-angular/dist/adal-angular.min.js': { format: 'global', deps: ['angular', 'adal'] }
},
paths: {
  'angular': 'node_modules/angular/angular.js',
  'adal': 'node_modules/adal-angular/dist/adal.min.js',
  'adal-angular': 'node_modules/adal-angular/dist/adal-angular.min.js'
}

然后,您可以import 'adal-angular';AuthenticationContext