使用 react-aad-msal 缺少范围从 react SPA 调用 web api

Posted

技术标签:

【中文标题】使用 react-aad-msal 缺少范围从 react SPA 调用 web api【英文标题】:Calling web api from react SPA using react-aad-msal missing scope 【发布时间】:2020-04-02 05:52:26 【问题描述】:

我正在从 react SPA web 应用程序调用受保护的 web api。 spa 和 web api 都已在 AzureAD 中注册,并通过“公开 API”和“API 权限”相互注册。

在客户端通过身份验证之后,在调用 web api 之前,调用 (await this.props.provider.getAccessToken()) 以获取访问令牌。身份验证提供程序配置为:

export const authProvider = new MsalAuthProvider(
    
        auth: 
            authority: "https://login.microsoftonline.com/common",
            clientId: "xxxx-xxxx-xxxxx",
            postLogoutRedirectUri: window.location.origin,
            redirectUri: window.location.origin,
            validateAuthority: true,
            navigateToLoginRequestUrl: false
        ,
        system: 
            logger: logger as any
        ,
        cache: 
            cacheLocation: "sessionStorage",
            storeAuthStateInCookie: false
        
    ,
    
        scopes: ["openid", "user.read", "api://xxxx-xxxxx-xxxxx/user_impersonation"]
    ,
    
        loginType: LoginType.Redirect,
        tokenRefreshUri: window.location.origin + "/auth.html"
    
);

其中“api://xxxx-xxxxx-xxxxx/user_impersonation”是 Web api 范围请求。对 web api 的授权失败并出现 401,因为在检查时返回的访问令牌缺少声明中的 web api 范围。

【问题讨论】:

【参考方案1】:

AAD 访问令牌仅对一个 API 有效,因此请确保在请求令牌时仅指定 API 的范围。 然后,AAD 将为您的应用提供 API 令牌。 在身份验证请求中为多个 API 指定范围应该是可以的,但是当您请求令牌时,请仅指定一个 API 的范围。

在 scopes 数组中,你有 user.read 用于 MS Graph API。

【讨论】:

做到了...实际上是在使用 angular-msal 中的示例,他们还在那里添加了多个 webapi 范围(ms 图形和自定义 web api),它似乎工作 - 也许它只拾取最后一个也添加了,即自定义 web api。但它正在工作。不过我这里不需要ms图,所以去掉了。

以上是关于使用 react-aad-msal 缺少范围从 react SPA 调用 web api的主要内容,如果未能解决你的问题,请参考以下文章

在R中将缺少的参数从函数传递到函数

从现有源创建android项目后缺少R类[重复]

Oracle:选择日期范围内缺少值的日期的值

从列中提取日期并在 R 中缺少年份时添加年份

在 Subversion 1.5 中将分支重新集成到主干时缺少范围错误消息

R包`bfast`错误:缺少需要TRUE / FALSE的值