我正在为我的一个 GWT 项目(我们称之为GWT-app)实施 OAuth2 身份验证。负责认证的应用程序是基于Spring Framework-3.1.2.RELEASE的第三方应用程序,并使用Spring Security-3.1.3.RELEASE中包含的 OAuth2 实现(我们称之为OAuth-app)。
GWT-app是一个管理用户和商店的管理应用程序。每个用户都有一个或多个经理帐户。经理帐户可能有一个或多个附属于它的商店,以便他可以从GWT 应用程序的一个屏幕完全管理它们。
这意味着用户可能需要通过不同的经理帐户进行多次身份验证才能在应用程序上按经理帐户显示商店。
所以在我的GWT-app的StoreManagement.java页面上,我有以下内容:
private final Map<String, ManagerAndStoresProxy> managerAndStores = Maps.newTreeMap(Ordering.natural());
身份验证后,此地图应填充经理名称和每个附加商店的列表。
OAUTH2 流程
授权码流用于身份验证。当GWT-app想要对某人进行身份验证时,它会将用户重定向到OAuth-app上的登录页面。用户输入他的凭据,将看到一个授权页面,询问他是否要允许GWT-app 访问他的信息。如果用户点击授权,他将被重定向回带有访问令牌的 GWT 应用程序。
问题
唯一的问题是,由于GWT-app正在将用户重定向到另一个应用程序进行身份验证,第一次身份验证工作并且地图被正确填充但是如果我必须验证另一个帐户,那么以前经过身份验证的帐户将被清除并且不能由于重定向而检索。
那么问题是:当第二个(第三个、第四个等)身份验证流程结束时(即在 OAuth-app 的 url 重定向之后),我如何继续保存这个映射并取回它。
到目前为止我已经尝试过什么
到目前为止,我所做的是,当用户想要从StoreManagement.java页面继续进行身份验证时,他会看到一个重定向到OAuth-app身份验证页面的弹出窗口。然后从此弹出窗口中检索访问令牌,但我必须将其发送回父窗口(即 StoreManagement.java 页面)。这可以通过 HTTP GET 参数来完成,但此方法会重新加载父页面,结果是相同的:先前经过身份验证的帐户被清除。
问题
在不清除先前上下文且不需要任何服务器端会话机制的情况下处理这种情况的最佳方法是什么?