【发布时间】:2018-04-02 02:26:00
【问题描述】:
我使用组件模式在 AngularJS 中使用 TypeScript 和组件路由器构建了一个 Angular 1.6 应用程序。
现在我正在尝试使用 ADAL 库和接受不记名令牌的安全 API 对 AzureAD 进行身份验证。
在我用 AngularJS 1.3 构建的当前应用程序之一中,我以非常标准的方式使用 ADAL,并使用 StateProvider 的 RequireAdLogin 属性对资源 (API) 进行身份验证:
var homeState = {
url: "/",
requireADLogin: true
};
这很好用,但现在我正在使用带有 angular-ui-router 的组件路由器(带有 @Types/angular-ui-router):
import * as angular from 'angular';
import { State, StateProvider } from 'angular-ui-router';
import { MyComponent } from './my.component';
import { NavService, NavItem } from './../../common/nav/nav.service';
import { MediaService } from "./MediaService .service";
function routeConfig($stateProvider: StateProvider) {
"ngInject";
$stateProvider
.state('app.media', {
url: '/media',
component: 'media'
});
问题是,我无法获取 API 来接收令牌。麻烦的第一个迹象是当我注意到 .IComponentOptions 类型和状态类型中缺少 requireADLogin 属性时,所以我不能这样做:
.state('app.media', {
url: '/media',
component: 'media',
requireADLogin: true // THIS DOES NOT COMPILE!
});
然后我做了一些研究,发现了这个相当令人沮丧的帖子:
GitHub ADAL 讨论:
https://github.com/AzureAD/azure-activedirectory-library-for-js/issues/283
不要走这条路。组件路由器已弃用https://docs.angularjs.org/guide/component-router
Doh!好吧,这对我来说不是什么好消息,至少可以说,因为现在我似乎被阻止了。我觉得应该有一些解决方法,但我看不到。
我认为编写自定义 HTTP 拦截器可能是一种解决方案,因为我只需要将存储在存储中的不记名令牌提供给 API 的 HTTP 标头。另外,我一直在查看用于 JS 的 MS 身份验证库:
https://github.com/AzureAD/microsoft-authentication-library-for-js
但这对于我的需求来说似乎太低了。
我应该提一下,要让 ADAL 的 AngularJS 库与 TypeScript 和这种新的组件模式一起工作是相当困难的。似乎首选路径是 Angular 2.0,但此时在 NG2 中重写是不可行的,因为该项目有时间限制。
【问题讨论】:
标签: javascript angularjs adal bearer-token