【问题标题】:How to get AppEngine User in Production Server through HttpServlet如何通过 HttpServlet 在生产服务器中获取 AppEngine 用户
【发布时间】:2017-06-26 13:25:45
【问题描述】:

UserService.getCurrentUser() 在 AppEngine HttpServlet 发布请求中返回 null。

resp.sendRedirect() 也没有被重定向。这发生在生产环境中,而user 数据在开发服务器中返回。

UserService userService = UserServiceFactory.getUserService();
user = userService.getCurrentUser();
if (user == null) {
  resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
  return;
}

OAuthService.getCurrentUser() 被调用时InvalidOAuthParametersException 被抛出。

OAuthService oathService = OAuthServiceFactory.getOAuthService();
try {
  String scope = "https://www.googleapis.com/auth/userinfo.email";
  user = oathService.getCurrentUser(scope);
} catch (OAuthRequestException e) {
  throw new IOException("Error retrieving user info!");
}

在生产环境中的 HttpServlet 中获取 User 数据会以所有可能的方式引发错误。检索User 数据的推荐方法是什么?

我在下面分享了@98​​7654330@ 文件。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <application>${appengine.app.id}</application>
  <version>${appengine.app.version}</version>
  <threadsafe>true</threadsafe>
  <env-variables>
    <env-var name="TEST_DATA" value="xxx"/>
  </env-variables>
  <system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
  </system-properties>
</appengine-web-app>

web.xml在下方分享

<?xml version="1.0" encoding="utf-8" standalone="no"?>
  <web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>SystemServiceServlet</servlet-name>
    <servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class>
    <init-param>
        <param-name>services</param-name>
        <param-value>com.setv.app.spi.DatabaseApi</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>SystemServiceServlet</servlet-name>
    <url-pattern>/_ah/spi/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>TransactionStatus</servlet-name>
    <servlet-class>com.setv.app.servlet.TransactionStatus</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TransactionStatus</servlet-name>
    <url-pattern>/transaction/*</url-pattern>
  </servlet-mapping>

  <filter>
    <filter-name>ObjectifyFilter</filter-name>
    <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>ObjectifyFilter</filter-name>
    <url-pattern>/*</url-pattern> 
  </filter-mapping>

  <security-constraint>
    <web-resource-collection>
        <web-resource-name>all</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
  </security-constraint>
</web-app>

【问题讨论】:

  • 你能显示你的 appengine.xml 配置文件吗?
  • @SimoneTallevi-Diotallevi 分享了 appengine-web.xml 文件
  • 我也可以看看你的 web.xml
  • @SimoneTallevi-Diotalevi web.xml 文件已共享。

标签: google-app-engine servlets


【解决方案1】:

为了使 UserService 工作,需要有一个特定的 web.xml 配置,强制用户登录到 AppEngine。 在您的 web.xml 中缺少以下条件:

<auth-constraint>
    <role-name>*</role-name>
</auth-constraint>
<user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

可能的角色名称是(admin 或 *)

https://cloud.google.com/appengine/docs/standard/java/config/webxml

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2018-04-22
  • 2018-01-24
  • 1970-01-01
  • 2015-12-20
相关资源
最近更新 更多