【发布时间】:2022-09-27 19:11:37
【问题描述】:
设置
msal(在另一个文件中。使用 MsalProvider 传递):
const msalInstance = new PublicClientApplication({
auth: {
clientId: <B2C-Application-ID>,
authority: \"https://login.microsoftonline.com/<tenant-directory-id>\",
redirectUri: \"http://localhost:3000\",
},
cache: {
cacheLocation: \"sessionStorage\",
storeAuthStateInCookie: false,
}
});
进口:
import * as msal from \"@azure/msal-browser\";
import {EventType, InteractionStatus} from \"@azure/msal-browser\";
import React, {createContext, FC, useState} from \"react\";
import {useIsAuthenticated, useMsal} from \"@azure/msal-react\";
import {AuthenticationContextType} from \"../@types/authentication\";
import {EndSessionRequest} from \"@azure/msal-browser/dist/request/EndSessionRequest\";
import jwtDecode, {JwtPayload} from \"jwt-decode\";
变量:
const {instance, accounts, inProgress} = useMsal();
const isAuthenticated = useIsAuthenticated();
const [token, setToken] = useState<string | null>(null);
登录:
function loginRedirect() {
instance.loginRedirect({
scopes: [\"User.Read\"],
prompt: \"select_account\"
});
}
获取令牌:
function getToken(): string | null {
if (token) {
const decodedJwt = jwtDecode<JwtPayload>(token);
if (decodedJwt.exp && decodedJwt.exp * 1000 > Date.now()) {
return token; // Token is still valid
}
}
// If token is not available or not valid anymore, acquire a new one
if (instance.getActiveAccount() && inProgress === InteractionStatus.None) {
const accessTokenRequest = {
scopes: [\"User.Read\"],
account: accounts[0]
}
instance.acquireTokenSilent(accessTokenRequest)
.then(response => {
console.log(`access token: ${response.accessToken}`);
console.log(`id token: ${response.idToken}`);
setToken(response.accessToken);
return response.accessToken;
})
.catch(err => {
if (err instanceof msal.InteractionRequiredAuthError) {
return instance.acquireTokenPopup(loginRequest)
.then(response => {
setToken(response.accessToken);
return response.accessToken;
})
.catch(err => {
console.log(err);
})
} else {
console.log(err);
}
})
} else {
console.error(\"No account logged in to acquire token\");
}
return null;
}
问题
我从 msal 获取了两个令牌(ID 和访问权限)(请参阅控制台日志)。 ID 令牌已成功验证(在我的 API 和 jwt.io 上),但我的访问令牌没有(在我的 API 和 jwt.io 上都没有)。参考this microsoft documentation 我应该使用访问令牌来验证 API。
据我所知,jwt.io 确实从https://sts.windows.net/<tenant-directory-id>/discovery/v2.0/keys 正确获取了公钥。这意味着this solution 要么已经过时,要么不能解决我的问题。为了确保我还尝试复制和粘贴公钥,这也不起作用。
我还发现 this solution 对我也不起作用。更改scopes 会导致无休止的登录循环。
版本:
\"@azure/msal-browser\": \"^2.28.3\",
\"@azure/msal-react\": \"^1.4.7\",
\"jwt-decode\": \"^3.1.2\",
标签: oauth-2.0 jwt azure-ad-b2c msal react-typescript