2010-01-06 46 views
4

我正在尝试编写一个仅适用于我自己的谷歌应用程序引擎应用程序。 (我知道这听起来很奇怪......我现在正在尝试编写一个登录servlet来验证用户使用谷歌的UserService,并让用户进入应用程序,只有当我登录,并会显示一条简短的消息提示注销其他所有人。谷歌应用程序引擎上的UserService问题

这是我写的代码:

public class MainPageServlet extends HttpServlet { 
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws IOException { 
    resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); 
    resp.setContentType("text/html"); 

    UserService userService = UserServiceFactory.getUserService(); 
     User user = userService.getCurrentUser(); 

     if (user != null) { 

      if(user.getEmail().equals("[email protected]")) { 
       resp.getWriter().println("done"); 
      } 
      else { 
       resp.getWriter().println("Hello, " + user.getNickname()+"<br>"); 
       resp.getWriter().println("Thanks for your interest. But this application is still not available to everybody."); 
       resp.getWriter().println("<a href="+UserServiceFactory.getUserService().createLogoutURL(userService.createLoginURL(req.getRequestURI()))+">Log out</a>"); 
      } 
     } else { 
      resp.sendRedirect(userService.createLoginURL(req.getRequestURI())); 
     }  
} 

}

与“驱赶”所有其他用户的代码工作正常。但是我登录时遇到问题:登录后,它会按预期显示消息“已完成”。但是,在此之后,如果我打开其他一些Google服务并从那里注销并再次调用此servlet,它仍会显示消息“已完成”。我曾预料该应用程序会提示我再次登录..这不会发生..我认为它的发生是因为结果得到缓存和禁用缓存(方法中的第一行)......但问题仍然存在后那..什么错了?我如何得到预期的行为?

回答

2

你没有。如果您希望用户注销您的服务,那么他们需要注销您的服务(通过调用UserManager的注销方法)。他们与其他谷歌服务共享用户名和密码的事实并不意味着注销这些其他服务会自动将其注销。

+0

你确定吗?那不是谷歌自己的应用程序的行为。如果您打开orkut和gmail,并且如果您从任一应用程序注销,则Google也会自动将您从其他应用程序注销。其单一标志。认为UserService的行为方式与用户的应用程序完全相同。 – Aadith 2010-01-06 20:22:01

+1

Orkut和Gmail不是App Engine应用程序。如果您不确定缓存是否存在干扰,请使用查询字符串参数并将其与“已完成”消息一起打印出来。 – 2010-01-06 21:11:20

+2

用户只需自动登录到您的应用程序就会非常不安全,因为他们已登录到其他Google服务。想象一下,您登录了Gmail,然后通过Google访问了一些随机App Engine应用程序,并且可以阅读您的电子邮件地址。 – 2010-01-06 21:43:31

0

我不太确定这一点,但是当您第一次登录到“appengine”应用程序时,您必须授予访问您个人资料信息的权限(我认为这是OAuth标准)。你可以限制这个天数。之后,该页面可以自动读取您的电子邮件,昵称和谷歌ID直到访问权限到期。

解决这个问题的方法是实现您自己的会话机制,并使用google登录只是为了检索userId(并从您的内部配置文件对象)开始会话(又名。登录)。

然后,如果您想从你的网页登出只,你会杀了会议,而不是从谷歌用户帐户注销