本地开发服务器的身份验证不起作用
Posted
技术标签:
【中文标题】本地开发服务器的身份验证不起作用【英文标题】:auth for local dev server doesn't work 【发布时间】:2018-08-06 08:43:12 【问题描述】:我正在设置一个 java/GAE/angular 应用程序引擎项目,并试图要求在某些路径上登录。我允许谷歌处理身份验证,我看到一个空指针似乎来自提供的com.google.appengine.api.users.dev.LocalLoginServlet.java
。如果我将项目部署到应用引擎,没有问题。
这是我的 web.xml 的相关部分:
<security-constraint>
<web-resource-collection>
<web-resource-name>Require Admin</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
这是堆栈跟踪:
java.lang.NullPointerException 在 com.google.appengine.api.users.dev.LoginCookieUtils.encodeEmailAsUserId(LoginCookieUtils.java:90) 在 com.google.appengine.api.users.dev.LoginCookieUtils.createCookie(LoginCookieUtils.java:42) 在 com.google.appengine.api.users.dev.LocalLoginServlet.doPost(LocalLoginServlet.java:93) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1772) 在 com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:941) 在 com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:875) 在 com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:829) 在 com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:119) 在 com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:133) 在 com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:130) 在 com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203) 在 com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) 在 com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:134) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) 在 com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) 在 com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) 在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:48) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) 在 com.google.appengine.tools.development.jetty9.StaticFileFilter.doFilter(StaticFileFilter.java:123) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) 在 com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366) 在 com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349) 在 com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) 在 com.google.appengine.tools.development.DevAppServerRequestLogFilter.doFilter(DevAppServerRequestLogFilter.java:44) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1751) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:582) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512) 在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112) 在 com.google.appengine.tools.development.jetty9.DevAppEngineWebAppContext.doScope(DevAppEngineWebAppContext.java:94) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) 在 com.google.appengine.tools.development.jetty9.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:597) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) 在 org.eclipse.jetty.server.Server.handle(Server.java:534) 在 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:320) 在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251) 在 org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:283) 在 org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:108) 在 org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) 在 org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303) 在 org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148) 在 org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589) 在 java.lang.Thread.run(Thread.java:748)
【问题讨论】:
【参考方案1】:原来我的问题与我的球衣配置有关。我必须将 _ah/?.* 添加到 ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX 参数中,这样它就不会干扰开发服务器调用 /_ah/login
【讨论】:
以上是关于本地开发服务器的身份验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章
React Native - Firebase 身份验证持久性不起作用