跨域环境下Nuxt SPA与ASP.NET Core的Google登录问题排查
问题背景
我花了几天时间解决跨域部署的Nuxt SPA客户端与ASP.NET Core服务端的Google登录问题。当前方案在默认拦截第三方Cookie的浏览器(如Brave、Safari)中完全失效,关闭拦截后则能正常运行。
正常流程:Nuxt应用通过外部链接跳转到API端点,该端点重定向用户到Google登录页;登录完成后,服务端将用户重定向回客户端,并通过Cookie存储令牌。但第三方Cookie被拦截时,这个流程走不通。
尝试的解决方案及新问题
为解决Cookie传递问题,我尝试用Nuxt代理,将请求通过客户端域名的Nuxt服务器转发。此时邮箱/密码登录能正常工作,但Google登录页显示在客户端域名下,输入邮箱后出现“Something went wrong”错误,推测是代理过度处理了Google相关请求。
随后我在Nuxt代理中设置redirect="manual":
const res = await proxyRequest(event, target, { fetchOptions: { credentials: "include", redirect: "manual" }, cookieDomainRewrite: "nietzschess.xyz" })
设置后Google登录页能正常在https://accounts.google.com/加载,但登录完成后Google重定向至后端回调URI时,API返回500错误。日志显示关联Cookie不匹配:
warn: Microsoft.AspNetCore.Authentication.Google.GoogleHandler[15]: '.AspNetCore.Correlation.YzS8xkFzg-4OG36DirGmUHqimr5lOwXKftNgHxO24Ec' cookie not found. info: Microsoft.AspNetCore.Authentication.Google.GoogleHandler[4] Error from RemoteAuthentication: Correlation failed.. fail: Microsoft.AspNetCore.Server.Kestrel[13] Connection id "0HNBNDSENR62I", Request id "0HNBNDSENR62I:00000005": An unhandled exception was thrown by the application. Microsoft.AspNetCore.Authentication.AuthenticationFailureException: An error was encountered while handling the remote login. ---> Microsoft.AspNetCore.Authentication.AuthenticationFailureException: Correlation failed. --- End of inner exception stack trace --- at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync() at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
回调请求中存在关联Cookie,但ID不匹配(.AspNetCore.Correlation.wBq43NhtKaKq7pwjxUNe-EasZpTygbPqzEylzqnXwOY=N)。我清楚关联Cookie在OAuth流程开始时分配给客户端,完成后失效,但不清楚为何在此阶段出现不匹配,希望得到帮助。
额外需求
想了解是否有更优的实现方案或参考示例。相关代码可查看GitHub仓库:
- client仓库
- api仓库
内容的提问来源于stack exchange,提问作者Hossein Ebrahimi

