【问题标题】:Client - API authentication flow with Microsoft Azure AD客户端 - 使用 Microsoft Azure AD 的 API 身份验证流程
【发布时间】:2023-01-14 10:15:36
【问题描述】:

我正在构建一个带有 spring 后端的反应前端应用程序,该应用程序由 azure ad 保护。

我无法使身份验证流程正常工作。

在 azure ad 中,我注册了 2 个应用程序:

  1. API:默认配置,在“公开 API”下,我添加了一个带有 api://xxxx-api/Access.Api 的范围,还添加了客户端应用程序。在“App Roles”下,我添加了角色“User”和“Admin”。我已将这两个角色分配给自己。
  2. 客户端:注册为 SPA,并重定向到正在运行 React 应用程序的 http://localhost:3000。没有选中令牌的两个框以启用 PKCE。在“API 权限”下,我从 api 应用程序添加了“Access.Api”范围并授予管理员同意。

    在 React 应用程序中,我使用的是 @azure/msal-browser@azure/msal-react

    我的 authConfig 看起来像这样:

    然后我只是使用useMsalAuthentication(InteractionType.Popup); 来登录用户。

    所有这一切都按预期工作,我得到了一个令牌。如果我在jwt.io 中解析这个标记, 我得到"iss": "https://sts.windows.net/42xxxxx-xxxxx-xxxxxx-xxxxx/""scp": "openid profile User.Read email""ver": "1.0",

    但是,我没有看到我的 API 应用程序的范围或角色。

    然后我使用 Axios 请求拦截器为每个 API 请求提供承载令牌:

    const { instance, accounts } = useMsal();
    const account = useAccount(accounts[0]);
    
    axios.interceptors.request.use(async (config) => {
        if (!account) {
            throw Error('No active account! Verify a user has been signed in.');
        }
        const response = await instance.acquireTokenSilent({
            ...loginRequest,
            account,
        });
        config.headers.Authorization = `Bearer ${response.accessToken}`;
    
        return config;
    });
    

    令牌已成功添加到每个请求的标头中。

    然而,我的 spring 应用程序无法验证此令牌。

    我的弹簧配置:

    如果这是一个问题,我可以自己实现令牌验证,但是我该如何解决,不记名令牌不包含我需要检查用户是否有权访问 api 上的特定资源的角色?

【问题讨论】:

    标签: reactjs spring-security azure-active-directory jwt msal


    【解决方案1】:

    我想到了。

    基本上 openidemailprofile 范围只能在请求 ID 令牌时使用。 ID 令牌包含在客户端应用程序中公开的所有角色。

    如果在请求访问令牌时使用这些范围,则令牌将根本不包含任何角色或范围。请求访问令牌时,仅使用在客户端应用程序中公开的 api 应用程序的范围,角色将显示在访问令牌中。

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 2018-06-21
      • 2021-04-05
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多