【问题标题】:Appengine user service +GWT not logging outAppengine 用户服务+GWT 未注销
【发布时间】:2012-03-09 18:22:14
【问题描述】:

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

我猜这与 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 凭据。

【问题讨论】:

    标签: google-app-engine gwt authentication


    【解决方案1】:

    理想情况下,从 GAE/Google 注销我会使用来自 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 中添加映射后,您可以简单地调用它来测试。

    【讨论】:

    • 好吧,我认为它可以正常工作,但仍然能够在不输入谷歌凭据的情况下重新登录我的应用程序。它将返回到我的登录页面,当我单击使用 google 帐户登录时,它会直接进入应用程序。这可能只是我正在做的事情......
    • 我粘贴链接的演示是一个工作演示。 logput URL 是您必须传递给客户端/UI 的内容,当使用单击“Signout”时,您必须在客户端调用 logOutURL。你能给我们看一些代码吗?
    • 好的,可以试试 loginURL = userService.createLoginURL("/"); logOutURL = userService.createLogoutURL(loginURL);
    • 使用“Window.Location.replace()”而不是“Window.Location.assign()”
    • 你还需要在 web.xml all/ **
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2021-11-23
    • 2023-03-27
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多