是否可以使用 MSAL 获取 Azure AD V1 令牌?
Is it possible to obtain an Azure AD V1 token using MSAL?
我目前正在为我的应用设置使用 MSAL 的 ADD。我 运行 遇到的问题是 api 设置为接受 Azure AD V1 令牌,但使用我当前的 MSAL 设置,我一直收到 Azure AD V2。
我团队中的其他人正在使用 ADAL,但我们想迁移到 MSAL。我确定我做错了什么,因为似乎很难相信没有向后兼容性。
这是我的 Msal 配置:
import * as Msal from 'msal';
export const applicationConfig = {
clientID: process.env.REACT_APP_MSAL_CLIENT_ID,
authority: process.env.REACT_APP_AUTHORITY_TENANT,
graphScopes: ['user.read'],
graphEndpoint: process.env.REACT_APP_GRAPH_ENDPOINT,
};
/**
* will get the call back once the API is complete
* (either complete or failure), redirects flows.
* Is called after the authentication request is completed
* successfully/failure
*
* @param {*} errorDesc
* @param {*} token
* @param {*} error
* @param {*} tokenType
*/
const tokenReceivedCallback = async (errorDesc, token, errorMsg) => {
try {
if (token) console.log('Success!');
} catch (error) {
throw new Error(`${errorMsg}:${errorDesc}`);
}
};
/**
* Instantiate UserAgentApplication
*/
const userAgentApplication = new Msal.UserAgentApplication(
applicationConfig.clientID,
applicationConfig.authority,
tokenReceivedCallback,
{
cacheLocation: process.env.REACT_APP_CACHE_LOCATION,
redirectUri: process.env.REACT_APP_REDIRECT_URI,
},
);
/**
* Log user in
* Checks if there is no user and if there is no
* callback occuring within the window url which throws into
* infinite loop, then login, and redirect to SSO login
* @param {*} graphScopes
*/
export const signIn = async graphScopes => {
console.log(graphScopes);
/**
* avoid duplicate code execution on page load in case of iframe and popup window
*/
if (!userAgentApplication.getUser() && !userAgentApplication.isCallback(window.location.hash)) {
/**
* login site, and go directly to SSO
*/
await userAgentApplication.loginRedirect(graphScopes, process.env.REACT_APP_DOMAIN);
/**
* acquireTokenSilent method makes a silent request to ADD to obtain an access token.
* ADD returns an access token containing the user consented scopes to allow
* the app to securely call the api
*/
await userAgentApplication.acquireTokenSilent(graphScopes);
}
};
/**
* Logs user out
*/
export const logOut = () => userAgentApplication.logout();
这是我使用 jwt.ms 时得到的结果:
提前致谢!
是的,可以从 V2 端点请求 V1 访问令牌。颁发给客户端应用程序的访问令牌类型(v1 或 v2)由资源的应用程序注册决定API。正如其他人指出的那样,您的示例代码请求 Microsoft Graph 范围并且 Microsoft Graph 应用程序注册配置为接受 v2 令牌。您可以通过查看应用程序注册来确定您的 API 配置为接受的令牌类型。在 portal.azure.com 中,打开“App registrations (Preview)”,转到“Manifest”部分,然后查找 属性“accessTokenAcceptedVersion”。如果它设置为 null 或 1,那么所有请求访问令牌以调用此资源的客户端应用程序都将获得 v1 访问令牌(无论它们是否使用 MSAL 或 ADAL 请求访问令牌)。
调用 v1 资源 API 的 ADAL 应用的常见调用模式是提供资源 URI 作为范围。这告诉端点为资源 API 的应用程序注册中配置的所有权限颁发访问令牌。 MSAL(使用 v2 终结点)允许请求任何范围,无论它是否在资源的应用注册范围的静态列表中。要获得与 ADAL(使用 v1 终结点)相同的行为,请将“.default”附加到资源 URI(例如“https://contoso.onmicrosoft.com/V1TodoListService/.default”)
在 Ignite 上,我演示了一个仅接受 v1 访问令牌的现有待办事项列表服务,并且我遍历了我的新 MSAL 客户端应用程序的整个门户配置以请求 v1 访问令牌并调用它服务。在这里观看:https://youtu.be/77A47CfNqIU?t=3120
我目前正在为我的应用设置使用 MSAL 的 ADD。我 运行 遇到的问题是 api 设置为接受 Azure AD V1 令牌,但使用我当前的 MSAL 设置,我一直收到 Azure AD V2。
我团队中的其他人正在使用 ADAL,但我们想迁移到 MSAL。我确定我做错了什么,因为似乎很难相信没有向后兼容性。
这是我的 Msal 配置:
import * as Msal from 'msal';
export const applicationConfig = {
clientID: process.env.REACT_APP_MSAL_CLIENT_ID,
authority: process.env.REACT_APP_AUTHORITY_TENANT,
graphScopes: ['user.read'],
graphEndpoint: process.env.REACT_APP_GRAPH_ENDPOINT,
};
/**
* will get the call back once the API is complete
* (either complete or failure), redirects flows.
* Is called after the authentication request is completed
* successfully/failure
*
* @param {*} errorDesc
* @param {*} token
* @param {*} error
* @param {*} tokenType
*/
const tokenReceivedCallback = async (errorDesc, token, errorMsg) => {
try {
if (token) console.log('Success!');
} catch (error) {
throw new Error(`${errorMsg}:${errorDesc}`);
}
};
/**
* Instantiate UserAgentApplication
*/
const userAgentApplication = new Msal.UserAgentApplication(
applicationConfig.clientID,
applicationConfig.authority,
tokenReceivedCallback,
{
cacheLocation: process.env.REACT_APP_CACHE_LOCATION,
redirectUri: process.env.REACT_APP_REDIRECT_URI,
},
);
/**
* Log user in
* Checks if there is no user and if there is no
* callback occuring within the window url which throws into
* infinite loop, then login, and redirect to SSO login
* @param {*} graphScopes
*/
export const signIn = async graphScopes => {
console.log(graphScopes);
/**
* avoid duplicate code execution on page load in case of iframe and popup window
*/
if (!userAgentApplication.getUser() && !userAgentApplication.isCallback(window.location.hash)) {
/**
* login site, and go directly to SSO
*/
await userAgentApplication.loginRedirect(graphScopes, process.env.REACT_APP_DOMAIN);
/**
* acquireTokenSilent method makes a silent request to ADD to obtain an access token.
* ADD returns an access token containing the user consented scopes to allow
* the app to securely call the api
*/
await userAgentApplication.acquireTokenSilent(graphScopes);
}
};
/**
* Logs user out
*/
export const logOut = () => userAgentApplication.logout();
这是我使用 jwt.ms 时得到的结果:
提前致谢!
是的,可以从 V2 端点请求 V1 访问令牌。颁发给客户端应用程序的访问令牌类型(v1 或 v2)由资源的应用程序注册决定API。正如其他人指出的那样,您的示例代码请求 Microsoft Graph 范围并且 Microsoft Graph 应用程序注册配置为接受 v2 令牌。您可以通过查看应用程序注册来确定您的 API 配置为接受的令牌类型。在 portal.azure.com 中,打开“App registrations (Preview)”,转到“Manifest”部分,然后查找 属性“accessTokenAcceptedVersion”。如果它设置为 null 或 1,那么所有请求访问令牌以调用此资源的客户端应用程序都将获得 v1 访问令牌(无论它们是否使用 MSAL 或 ADAL 请求访问令牌)。
调用 v1 资源 API 的 ADAL 应用的常见调用模式是提供资源 URI 作为范围。这告诉端点为资源 API 的应用程序注册中配置的所有权限颁发访问令牌。 MSAL(使用 v2 终结点)允许请求任何范围,无论它是否在资源的应用注册范围的静态列表中。要获得与 ADAL(使用 v1 终结点)相同的行为,请将“.default”附加到资源 URI(例如“https://contoso.onmicrosoft.com/V1TodoListService/.default”)
在 Ignite 上,我演示了一个仅接受 v1 访问令牌的现有待办事项列表服务,并且我遍历了我的新 MSAL 客户端应用程序的整个门户配置以请求 v1 访问令牌并调用它服务。在这里观看:https://youtu.be/77A47CfNqIU?t=3120