【发布时间】:2020-01-31 18:50:27
【问题描述】:
我们在 Azure 门户上注册了一个应用程序,我们希望在前端使用 MSAL.js,在后端使用 hapi-auth-jwt2 和 jwks-rsa 来验证用户身份。后端不是托管在 Azure 上,而是托管在我们自己的 MySQL 服务器上。
根据此示例active-directory-b2c-javascript-msal-singlepageapp,我们可以使用MSAL.js 进行登录,并以静默方式或弹出窗口获取ID 和访问令牌。然后,我们将 访问令牌 附加到像 Vue.prototype.$http.defaults.headers.common['Authorization'] = 'Bearer ' + token 这样的 http 标头,并将带有 axios 的请求发送到我们的后端 /login 路由。当我们从客户端访问路由时,jwt 身份验证策略会启动并尝试使用从公共https://login.microsoftonline.com/common/discovery/keys 检索到的通过jwks-rsa 检索到的密钥来解码令牌。
问题是来自/login 的响应带有401 (Unauthorized) 和res.headers.www-authenticate: "Bearer error=\"Invalid token\""。
当我们将访问令牌复制/粘贴到 jwt.io 中时,我们注意到我们解码的标头对象由 typ、nonce、alg、x5t、kid 组成,并且签名返回为无效.此外,我们的应用注册当前在所需权限下选择了带有 User.Read 的 Microsoft Graph,但我们将其删除。
为了测试问题是否出在我们的 JWT 策略中,我们将 ID 令牌而不是访问令牌传递给了 Bearer。 JWT 解码了令牌,但返回的响应是 res.headers.www-authenticate: "Bearer error=\"Invalid credentials\""
我们的问题是:
- 是否可以在不调用 Graph API 的情况下验证访问令牌,我们如何做到这一点?
- 如果上述方法不可行,我们可以使用 ID 令牌对用户进行身份验证吗?这将如何工作?
- 如果我们可以在不调用 Graph API 的情况下验证访问令牌,https://portal.azure.com/ 中的设置应该是什么?
【问题讨论】:
标签: azure authentication jwt azure-active-directory msal.js