我正在使用Azure AD对我的单页应用程序(Angular4)进行身份验证,并使用Adal.js进行相同的操作。在登录页面上,我单击重定向到Microsoft AAD的按钮,并在成功登录后重定向到应用程序主页,并从JWT接收id_token
和用户信息。
我需要access_token
进行后端API访问,这是我尝试通过ADAL AuthenticationContext
的getCachedToken()
方法获取的,并发送clientId作为参数:
this.context.getCachedToken(this.configService.AdalConfig.clientId)
但是此方法返回的 token 与
id_token (adal.idtoken)
相同,该 token 存储在 session 存储中。它基本上是通过使用级联键在 session 存储中创建一个新项目的,该键具有与id_token
相同的值adal.access_token.key + clientId = id_token
例如:
adal.access_token.key239f6fc7-64d2-3t04-8gfd-501efc25adkd = <id-token-value>
。我还尝试使用
access_token
方法获取AuthenticationContext.acquireToken()
,但它也将id_token
退回了。我要去哪里错了?
编辑:发布代码。
我正在调用函数
login()
,并成功登录后,尝试通过get accessToken()
中的adal.config.ts
属性访问器在主页中获取访问 token 。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;
}
}
最佳答案
实际上,经过一番阅读之后,事实证明将SPA连接到Azure AD需要OAuth 2.0隐式授予流。 Microsoft documentation说:
因此,我需要将id_token
本身发送到后端API,然后可以对其进行验证和使用。给出更多有关验证的信息here:
关于javascript - 尝试使用ADAL.js AuthenticationContext获取访问 token 时,access_token与id_token相同吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47234519/