【发布时间】:2020-05-21 06:13:12
【问题描述】:
我使用 Auth0 API。整个应用程序位于单个 Tomcat 服务器、HTTPS 连接器上。如果 WebFilter 检查身份验证找到了身份验证令牌,它不会调用 LoginServlet,但通常会继续到目标 servlet。
在Auth0的服务器上调用/authorize有两种情况:
静态网页中某个 servlet S 的链接,被 WebFilter 截获。 WebFilter 然后调用(如果未找到身份验证令牌)使用 Auth0 成功进行身份验证的 LoginServlet,这里从来没有问题。
JS 的 fetch() 到 servlet X,被上面相同的 WebFilter 拦截。 WebFilter 然后调用(同样,如果没有找到身份验证令牌)完全相同的 LoginServlet,它调用完全相同的 /authorize URL。这一次它总是以“No 'Access-Control-Allow-Origin' header”失败。
然而,如果 WebFilter 找到 auth 令牌并正常转发到 servlet X,那么调用 Auth0 /userinfo 又没有问题。
“No 'Access-Control-Allow-Origin' header”消息指定了 Origin,这是正确的,在两种情况下都相同,只是应用程序的域,并且存在于 Auth0 应用程序设置 Allowed Web Origins 和 Allowed origins (CORS )。
问题的根源是什么?如果用户与应用程序的第一次交互是通过 JS 进行的,如何验证用户身份?例如,应用程序的页面打开,会话超时,然后用户按下一个键,导致 JS 调用一个需要身份验证的 servlet。
不知道有没有什么关系,但是我在本地机器上运行Tomcat,所以它也是Chrome的localhost。
另外,刚刚测试过:通过浏览器地址栏中的 URL 或通过单击的链接调用的完全相同的 servlet 登录正常,但通过 fetch() 调用会导致有问题的 CORS 错误。
【问题讨论】:
标签: javascript servlets cors fetch auth0