Appengine用户服务+ GWT未注销

时间:2012-02-18 18:03:38

标签: google-app-engine gwt authentication

我有一个带有GWT前端的appengine应用程序。我使用appengine的用户服务来验证谷歌帐户。我的问题是从GWT前端退出时用户没有完全注销。用户会看到登录页面,但是当您点击谷歌谷歌帐户再次登录时,它会直接进入应用程序而无需访问谷歌登录页面。我这里没有使用任何自定义登录/传递字段,严格来说是用户服务。

我猜这与HTTP会话和基本身份验证有关,但我还是无法完全注销。

以下是服务器上的登录/退出服务:

import javax.servlet.http.HttpSession;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class LoginServiceImpl extends RemoteServiceServlet implements
LoginService {
  public final static String CHANNEL_ID = "channel_id";

  @Override
  public UserAccountDTO getLoggedInUserDTO() {
    UserAccountDTO userDTO;
    HttpSession session = getThreadLocalRequest().getSession();

    UserAccount u = LoginHelper.getLoggedInUser(session, null);
    if (u == null)
      return null;
      userDTO = UserAccount.toDTO(u);
      UserService userService = UserServiceFactory.getUserService();
      userDTO.setLogoutURL(userService.createLogoutURL(requestUri));
    return userDTO;
  }

  @Override
  public void logout() throws NotLoggedInException {
     getThreadLocalRequest().getSession().invalidate();
    throw new NotLoggedInException("Logged out");
  }

} 

在GWT客户端,我使用此代码注销:

Window.Location.assign(currentUserDTO.getLogoutURL());

当我点击我的应用程序上的注销链接(运行上面的代码)时,没有任何变化。但是,如果我重新加载页面,我会被发送到我的应用程序的登录页面。当我点击使用我的谷歌帐户登录时,它直接进入我的应用程序而不需要谷歌凭据。这告诉我用户已从我的appengine应用程序注销,但是用户仍以某种方式登录到他在浏览器中的谷歌帐户(我假设一个身份验证令牌存储为cookie?)。我需要让我的用户完全退出Google帐户,以便下一位访问该网站的访问者获取Google凭据。

1 个答案:

答案 0 :(得分:2)

理想情况下,对于来自GAE / Google的LogOut,我会使用来自userService的logOutUrl。例如

UserService userService = UserServiceFactory.getUserService();
logOutURL = userService.createLogoutURL(baseURL);

logOutURL是我将窗口重定向到,从Google注销的地方

还要检查我写的一个小servlet,登录并注销:http://cloudspring-demo.appspot.com/html/csAuth.html 您可以简单地将此servlet复制到适当的servlet中,并在web.xml中添加映射后,只需调用它即可进行测试。