如何在Vue / Hapi JS应用中使用AzureAD进行身份验证

时间:2019-10-02 13:18:59

标签: azure authentication jwt azure-active-directory msal.js

我们有一个在Azure门户上注册的应用,我们想在前端使用MSAL.js,在后端使用hapi-auth-jwt2jwks-rsa来验证用户身份。后端不是托管在Azure上,而是托管在我们自己的MySQL服务器上。

根据此示例active-directory-b2c-javascript-msal-singlepageapp,我们可以使用MSAL.js登录,并以静默方式或弹出窗口获取ID和访问令牌。然后,我们将访问令牌附加到http标头上,例如Vue.prototype.$http.defaults.headers.common['Authorization'] = 'Bearer ' + token,并将带有axios的请求发送到我们的后端/login路由。当我们从客户那里获得路由时,jwt身份验证策略开始运行,并尝试使用从公共https://login.microsoftonline.com/common/discovery/keysjwks-rsa检索到的密钥对令牌进行解码。

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

当我们将访问令牌复制/粘贴到jwt.io时,我们注意到解码的标头对象由typnoncealgx5t,{{ 1}},并且签名返回为无效。另外,我们的App注册中已在所需权限下选择了kid的Microsoft Graph,但我们将其删除。

要测试问题是否出在我们的JWT策略中,我们将ID令牌传递给Bearer而不是访问令牌。 JWT对令牌进行了解码,但响应返回User.Read

我们的问题是:

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

1 个答案:

答案 0 :(得分:0)

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