如何验证前端 SPA 应用程序和 API 两者都使用 Azure Easy Auth

How to authenticate a frontend SPA app and API when both use Azure Easy Auth

情况

我有一个后端 API 和前端 SPA 应用程序都托管在 Azure 中。我使用相同的应用程序注册通过 Azure AD Easy Auth 保护了这两个应用程序服务。这有效 - 如果我尝试访问前端应用程序,我将被重定向到我可以登录的 Microsoft 登录页面,如果我访问 API,我将返回 401(我可以通过 [=12= 交互式登录) ]).在这两个应用程序中,我都可以访问 /.auth/me 来检索 id_tokenaccess_token 等。我的 SPA 应用程序将查询此端点以检索 id_token。然后它使用此令牌通过 Bearer 令牌与 API 通信。这种通信有效,我可以通过这种方式成功调用端点。

我遇到的问题是一段时间后,前端存储和发送的id_token失效了。我假设前端会要求用户再次登录,这会刷新 id_token 但事实并非如此。我做了一些挖掘,显然我应该发送 access_token 而不是 id_token。但是,我的 API 拒绝了:

{
    "code": 401,
    "message": "IDX10511: Signature validation failed. Keys tried: '[PII is hidden]'. \nkid: '[PII is hidden]'. \nExceptions caught:\n '[PII is hidden]'.\ntoken: '[PII is hidden]'."
}

https://jwt.io 也无法验证访问令牌。

我在寻找 SPA 应用的 resources/documentation 和 API 时遇到了很多麻烦,两者 都使用 Easy Auth 以及如何让它们互相交谈。

已经尝试过的东西

当前端和后端都受 Azure Easy Auth 保护时,验证前端和后端的标准方法是什么?我应该使用 access_token 还是 id_token 进行身份验证?如果是后者,我该如何刷新呢?

您似乎正在接收 graph 的访问令牌。 请确保为后端网站创建范围 api .

Note:User.Read is for graph api access and may have nonce in token generated which may make the signature invalidated for you web api.

因此,请在门户中创建一个新范围来标识您的后端api,即;修改您的应用以获取 API.

的访问令牌
  1. 您的水疗应用 > Expose an API > 添加范围。 (创建一个新的作用域: say name = access_as_user)
  2. API权限中:为已注册的应用程序和范围添加新权限access_as_user。像 api://<app id>/ scope name

确保将此范围名称放置在应用范围中使用的任何位置(删除 user.read 如果存在并添加 api 的范围)和 grant 管理员同意。 现在再试一次并检查 https://jwt.io 中的令牌。

如果有进一步的错误说观众无效: 转到清单:将条目“accessTokenAcceptedVersion”从(null 或 1)更改为 2 并尝试。如果不成功,请尝试从您的应用配置范围中删除 api:// 前缀。

参考文献:

  1. 教程:E2E 用户身份验证 - Azure 应用服务 |微软 文档
  2. azure - Setting additionalLoginParams with auth v2 - Stack Overflow
  3. IDX10511 -issue (github.com)