0

我们在 Azure 门户上注册了一个应用程序,我们希望MSAL.js在前端和后端hapi-auth-jwt2使用jwks-rsa来对用户进行身份验证。后端不是托管在 Azure 上,而是托管在我们自己的 MySQL 服务器上。

根据这个示例active-directory-b2c-javascript-msal-singlepageapp,我们可以使用MSAL.js静默方式或弹出窗口来登录并获取 ID 和访问令牌。然后,我们像这样将访问令牌附加到 http 标头,并向我们的后端路由Vue.prototype.$http.defaults.headers.common['Authorization'] = 'Bearer ' + token发送请求。当我们从客户端访问路由时,身份验证策略会启动并尝试使用从公共https://login.microsoftonline.com/common/discovery/keys检索到的密钥来解码令牌。axios/loginjwtjwks-rsa

问题是/login来自的响应带有一个401 (Unauthorized)res.headers.www-authenticate: "Bearer error=\"Invalid token\""

当我们将访问令牌复制/粘贴到 jwt.io 中时,我们注意到我们解码的标头对象由typnoncealg、组成x5tkid并且签名返回为无效。此外,我们的应用程序注册User.Read当前已在所需权限下选择了 Microsoft Graph,但我们将其删除。

为了测试问题是否出在我们的 JWT 策略中,我们将 ID 令牌而不是访问令牌传递给了 Bearer。JWT 解码了令牌,但响应返回res.headers.www-authenticate: "Bearer error=\"Invalid credentials\""

我们的问题是:

  1. 是否可以在不调用 Graph API 的情况下验证访问令牌,我们如何做到这一点?
  2. 如果上述方法不可行,我们可以使用 ID 令牌对用户进行身份验证吗?这将如何工作?
  3. 如果我们可以在不调用 Graph API 的情况下验证访问令牌,那么https://portal.azure.com/中的设置应该是什么?
4

1 回答 1

0

解决方案是在https://portal.azure.com中为我们的 API 定义一个范围,然后使用新创建的范围创建 API 权限。访问令牌被成功解码,hapi-auth-jwt2之后我们在validate()函数内部进行了另一个内部级别的身份验证,isValid: true如果内部身份验证返回正确的结果,则返回。希望这可以帮助某人

于 2019-10-02T15:57:18.673 回答