我有一个带有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凭据。
答案 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中添加映射后,只需调用它即可进行测试。