我们有一个在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
,并将带有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
,{{ 1}},并且签名返回为无效。另外,我们的App注册中已在所需权限下选择了kid
的Microsoft Graph,但我们将其删除。
要测试问题是否出在我们的JWT策略中,我们将ID令牌传递给Bearer而不是访问令牌。 JWT对令牌进行了解码,但响应返回User.Read
我们的问题是:
答案 0 :(得分:0)
解决方案是在https://portal.azure.com内为我们的API定义一个范围,然后使用新创建的范围创建API权限。访问令牌已由hapi-auth-jwt2
成功解码,然后我们在validate()
函数内部进行了另一个内部身份验证,如果内部身份验证返回了正确的结果,则返回isValid: true
。希望这对某人有帮助