gpt4 book ai didi

adal - 无法使用msal-browser静默或通过重定向获取 token

转载 作者:行者123 更新时间:2023-12-03 17:07:14 25 4
gpt4 key购买 nike

我正在尝试开发一个VueJS单页应用程序,该应用程序会将您登录到AAD,以便我可以获取访问 token 以调用各种AP​​I(例如Graph)。
用户登录后,您必须获取 token ,并且有两种方法可以这样做:静默方式(如果失败,则使用重定向体验)。
但是,我无法使用两种方法来获取 token :

export default class AuthService {
constructor() {
console.log('[AuthService.constructor] started constructor');

this.app = new Msal.PublicClientApplication(msalConfig);
this.signInType = 'loginRedirect';
}

init = async () => {
console.log('[AuthService.init] started init');

await this.app.handleRedirectPromise().catch(error => {
console.log(error);
});


try {

let signedInUser = this.app.getAllAccounts()[0];

// if no accounts, perform signin
if (signedInUser === undefined) {
alert(this.app.getAllAccounts().length == 0)
await this.signIn();
signedInUser = this.app.getAllAccounts()[0];
console.log("user has been forced to sign in")
}

console.log("Signed in user is: ", signedInUser);

// Acquire Graph token
try {
var graphToken = await this.app.acquireTokenSilent(authScopes.graphApi);
console.log("(Silent) Graph token is ", graphToken);
alert(graphToken);
} catch (error) {
alert("Error when using silent: " + error)
try {
var graphToken = await this.app.acquireTokenRedirect(authScopes.graphApi);
} catch (error) {
alert ("Error when using redirect is: " + error)
}

alert("(Redirect) Graph token is " + graphToken);
}

} catch (error) {
console.log('[AuthService.init] handleRedirectPromise error', error);
}
}

signIn = async () => {
console.log('[AuthService.signIn] signInType:', this.signInType);
this.app.loginRedirect("user.read", "https://xxx.azurewebsites.net/user_impersonation");
}

signOut = () => {
this.app.logout();
}
}
加载SPA后,我将重定向到AAD登录页面。
然后,我得到以下警报提示:

Error when using silent: ClientAuthError: no_account_in_silent_request: Please pass an account object, silent flow is not supported without account information


Error when using redirect is: BrowserAuthError: interaction_in_progress: Interaction is currently in progress. Please ensure that this interaction has been completed before calling an interactive API.


(Redirect) Graph token is undefined


即使我已登录,为什么 acquireTokenSilent仍未登录? BrowserAuthError: interaction_in_progress是什么意思?我在网上搜索了此内容,发现的唯一结果是因为有人使用了过时的msal-browser版本。就我而言,我使用的是最新版本和最新版本(v2.0.1)。

更新1:
我使用以下代码摘录修复了无提示 token 获取:
const silentRequest = {
account: signedInUser,
scopes: authScopes.graphApi.scopes1
}
var graphToken = await this.app.acquireTokenSilent(silentRequest);
好像我以错误的格式传递了我的范围(即应该传递一个数组,它实际上不是一个数组!)
但是,Microsoft文档中有关如何使用 acquireTokenSilent的信息存在差异
here上,我们被告知只需将一组范围传递给 acquireTokenSilent方法。但是, over here,我们也被告知在范围的旁边传递accountInfo。
让我们看看我现在是否可以使 acquireTokenRedirect工作...

更新2:
经过多次试验和错误,我终于使 acquireTokenRedirect运行正常。
import * as Msal from '@azure/msal-browser';

const msalConfig = {
auth: {
clientId: "XYZ",
authority: "ABC",
},
cache: {
cacheLocation: 'localStorage',
storeAuthStateInCookie: true
}
};

export default class AuthenticationService {

constructor() {

this.app = new Msal.PublicClientApplication(msalConfig)
}

init = async () => {

try {
let tokenResponse = await this.app.handleRedirectPromise();

let accountObj;
if (tokenResponse) {
accountObj = tokenResponse.account;
} else {
accountObj = this.app.getAllAccounts()[0];
}

if (accountObj && tokenResponse) {
console.log("[AuthService.init] Got valid accountObj and tokenResponse")
} else if (accountObj) {
console.log("[AuthService.init] User has logged in, but no tokens.");
try {
tokenResponse = await this.app.acquireTokenSilent({
account: this.app.getAllAccounts()[0],
scopes: ["user.read"]
})
} catch(err) {
await this.app.acquireTokenRedirect({scopes: ["user.read"]});
}
} else {
console.log("[AuthService.init] No accountObject or tokenResponse present. User must now login.");
await this.app.loginRedirect({scopes: ["user.read"]})
}
} catch (error) {
console.error("[AuthService.init] Failed to handleRedirectPromise()", error)
}

}

}

最佳答案

经过一些反复试验,但终于使acquireTokenRedirect成功运行,这是节录,可以帮助其他人:

import * as Msal from '@azure/msal-browser';

const msalConfig = {
auth: {
clientId: "XYZ",
authority: "ABC",
},
cache: {
cacheLocation: 'localStorage',
storeAuthStateInCookie: true
}
};

export default class AuthenticationService {

constructor() {

this.app = new Msal.PublicClientApplication(msalConfig)
}

init = async () => {

try {
let tokenResponse = await this.app.handleRedirectPromise();

let accountObj;
if (tokenResponse) {
accountObj = tokenResponse.account;
} else {
accountObj = this.app.getAllAccounts()[0];
}

if (accountObj && tokenResponse) {
console.log("[AuthService.init] Got valid accountObj and tokenResponse")
} else if (accountObj) {
console.log("[AuthService.init] User has logged in, but no tokens.");
try {
tokenResponse = await this.app.acquireTokenSilent({
account: this.app.getAllAccounts()[0],
scopes: ["user.read"]
})
} catch(err) {
await this.app.acquireTokenRedirect({scopes: ["user.read"]});
}
} else {
console.log("[AuthService.init] No accountObject or tokenResponse present. User must now login.");
await this.app.loginRedirect({scopes: ["user.read"]})
}
} catch (error) {
console.error("[AuthService.init] Failed to handleRedirectPromise()", error)
}

}

}

关于adal - 无法使用msal-browser静默或通过重定向获取 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63347299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com