0

开发了一个React应用程序,它需要使用访问令牌调用两个不同的 API。应用程序的代码使用react-aad-msal库进行身份验证。最初,该应用程序已构建为仅调用一个 API,在该 API 中,我请求了必要的访问令牌,其工作原理类似于魅力。

根据有关使用权限的Microsoft 文档,其中指出:

访问令牌只能用于单个资源,但在访问令牌中编码的是您的应用已授予该资源的所有权限。

基于此,我需要请求两个不同的访问令牌,因为资源不同,这很清楚。

只有一种资源和范围的工作解决方案:

<AzureAD>为包装器创建必要的提供程序:

const config = {
   auth: {
      authority: process.env.REACT_APP_AUTH_AUTHORITY,
      clientId: process.env.REACT_APP_AUTH_CLIENT_ID,
      redirectUri: process.env.REACT_APP_AUTH_REDIRECT_URI
   },
   cache: {
      cacheLocation: 'localStorage',
      storeAuthStateInCookie: true
   }
};

const authenticationParameters = {
   scopes: ['https://<our-api-name>.azurewebsites.net/user_impersonation'],
};

// saved to AuthenticationService.provider - logic removed
new MsalAuthProvider(config, authenticationParameters, LoginType.Redirect);

然后将其传递给<AzureAD>包装器:

<AzureAD provider={AuthenticationService.provider}
         forceLogin={true}>

这里没有问题。

问题:

所以我有点困惑如果我需要来自不同资源和范围的两个访问令牌,我应该如何处理这种情况。

一旦我尝试将其他资源和范围添加到范围数组,如下所示:

const authenticationParameters = {
    scopes: [
       'https://<our-app-name>.azurewebsites.net/user_impersonation',
       'https://<tenant-name>.onmicrosoft.com/<api-guid>/access_as_user'
    ],
};

它显然给出了以下错误消息:

AADSTS28000:为输入参数范围提供的值无效,因为它包含多个资源。

对以下内容感兴趣:

  1. 我应该如何正确获取其他访问令牌以发送到其他 API?
  2. 用户不应该被重定向两次到登录页面吗?
  3. 这种情况可以在一个请求中以某种方式处理吗?

任何澄清或想法表示赞赏,谢谢!

4

2 回答 2

1

我应该如何正确获取其他访问令牌以发送到其他 API?

可悲的是,我不确定如何在该库的上下文中做到这一点。通常您在 UserAgentApplication 对象上调用acquireTokenSilent 两次。

用户不应该被重定向两次到登录页面吗?

否。您为登录重定向指定了两个范围。然后,您可以使用 acquireTokenSilent 静默获取两个令牌,无需用户交互。

是否可以以某种方式在一个请求中处理这种情况

见上,你需要调用 login 一次,acquireTokenSilent 两次。

于 2020-01-17T06:12:49.530 回答
1

顺便说一句,有 2 个 API 级别的架构通常是首选选项,当然这可能超出了您当前问题的范围:

  • 入口点 API 专注于为您的 React 应用程序和类似的消费者提供服务——这可能被称为用户体验 API
  • 入口点 API 调用核心服务来完成真正的工作——这些可能是产品、用户、库存 API

在此设置中,每个 UI 只需要调用一个 API,并且与从多个来源获取数据相关的 OAuth 工作更简单

于 2020-01-17T08:30:29.647 回答