我正在使用Adal.js对我的单页应用程序(Angular4)进行Azure AD身份验证。在登录页面上,我点击一个按钮,重定向到Microsoft AAD,并在成功登录后重定向回应用程序主页,从JWT接收
我需要
但是这种方法返回的仍然是存储在会话存储中的同一个令牌,即
id_token
和用户信息。我需要
access_token
以访问后端API。我尝试通过ADAL的AuthenticationContext
的getCachedToken()
方法获取它,并将clientId作为参数发送:this.context.getCachedToken(this.configService.AdalConfig.clientId)
但是这种方法返回的仍然是存储在会话存储中的同一个令牌,即
id_token (adal.idtoken)
。它基本上通过一个连接的键创建了一个在会话存储中的新项,该项的值与id_token
相同。adal.access_token.key + clientId = id_token
例如:adal.access_token.key239f6fc7-64d2-3t04-8gfd-501efc25adkd = <id-token-value>
.
我也试过使用AuthenticationContext.acquireToken()
方法获取access_token
,但它同样返回了id_token
。
我错在哪里了?
编辑:发布代码。 我正在调用函数login()
,成功登录后,通过adal.config.ts
中的get accessToken()
属性访问器,在主页上尝试获取访问令牌。
config.service.ts
import { Injectable } from '@angular/core';
@Injectable()
export class ConfigService {
constructor() {}
public get AdalConfig(): any {
return {
tenant: 'common',
clientId: <application-id>,
redirectUri: window.location.origin + '/',
postLogoutRedirectUri: window.location.origin + '/'
};
}
}
adal.service.ts
import { ConfigService } from './config.service';
import { Injectable } from '@angular/core';
import { adal } from 'adal-angular';
let createAuthContextFn: adal.AuthenticationContextStatic = AuthenticationContext;
@Injectable()
export class AdalService {
private context: adal.AuthenticationContext;
constructor(private configService: ConfigService) {
this.context = new createAuthContextFn(configService.AdalConfig);
}
login() {
this.context.login();
}
logout() {
this.context.logOut();
}
handleCallback() {
this.context.handleWindowCallback();
}
public get userInfo() {
return this.context.getCachedUser();
}
public get accessToken() {
return this.context.getCachedToken(this.configService.AdalConfig.clientId);
// return this.context.acquireToken(this.configService.AdalConfig.clientId, function(message, token, response) {
// console.log(message, token, response);
// });
}
public get isAuthenticated() {
return this.userInfo && this.accessToken;
}
}
config.service.ts
和adal.service.ts
代码,这是我在其中指定所有AAD所需信息的地方。希望这能有所帮助 :) - Rishabh