我正在尝试使用 Vue.js 中的 oidc-client 库在 SPA 中进行身份验证。我一直在关注本教程:https ://damienbod.com/2019/01/29/securing-a-vue-js-app-using-openid-connect-code-flow-with-pkce-and- identityserver4/和我的代码几乎相同,除了显然将 URL 更改为我自己的本地主机。我之前没有使用过代码流,所以我只是想验证服务器在登录阶段之后实际上应该返回什么。
本质上我的问题是,当应用程序访问 callback.html 时,我收到一个如下所示的错误:
Error: No state in response
at e.t [as readSigninResponseState] (oidc-client.min.js:1)
at e.t [as processSigninResponse] (oidc-client.min.js:1)
at e.t [as _signinEnd] (oidc-client.min.js:47)
at e.t [as signinRedirectCallback] (oidc-client.min.js:47)
at callback.html:10
这是由于对 callback.html 的调用而发生的:
var mgr = new Oidc.UserManager({ response_mode: 'query', userStore: new Oidc.WebStorageStateStore() }).signinRedirectCallback()
到目前为止,一切看起来都很正常 - 我可以单击登录,它会将我重定向到我的 IdentityServer 登录页面,我可以登录并且我可以验证服务器中没有引发错误。我担心的是重定向没有传递足够的信息。本质上,它会完全重定向回 callback.html,但 URL 中没有数据,只有回调。相反,我在请求标头中得到的是一个 Asp.Net 防伪 cookie 和一个包含 returnUrl 的引荐来源网址,其中包含响应类型、重定向 uri、范围等信息。
作为从 IdentityServer 重定向的一部分,我还获得了一个额外的 cookie,该 cookie 被命名为 .AspNetCore.Identity.Application。我认为这是包含身份验证数据的内容,但我只是想确保我到目前为止所拥有的内容是正常的。这是代码流的预期行为吗?
编辑
经过更多调查后,我注意到,虽然我的 callback.html 文件在登录后被重定向时失败,但如果我返回主页并再次单击登录按钮,它会将我重定向回带有查询的 callback.html 页面类似于以下内容的字符串:
https://localhost:44357/callback.html?code=aee0eafb34066958344bb53c01974224930bbdd2d94909f49c77d5157fb6aeed&scope=openid%20profile%20offline_access&state=921f726007c4431691d47340b433d097&session_state=rd7WVDvMIPWPqKviVZNSkbbhRoEoIftGbv9R841SuRs.a0674cdf7462338238499b73682dc5b5
之后我被重定向回主页并且我已经成功通过身份验证。
这几乎是我所期望的,也是我在最初的问题中所暗示的。这是在 oidc-client 库上调用 userManager.signinRedirect() 的结果。
我不确定它是如何设法找到该信息的,服务器是否应该首先重定向到该 URL?我有点不清楚这是客户端还是服务器端的期望。