【问题标题】:In GWT: how to bookmark a page and be able to be redirected to it after authentication?在 GWT 中:如何为页面添加书签并在身份验证后能够重定向到该页面?
【发布时间】:2013-09-06 11:20:00
【问题描述】:

我在我的 GWT 应用程序中实现了 OAuth2 身份验证机制。 OAuth2 服务器基于 Spring 框架 3.x(使用其 Spring 安全性 OAuth2 实现)。

我正在使用 OAuth2 “授权代码流” 来获得用户身份验证(尽管在我们的例子中隐式流可能是更好的选择)。因此,首先,用户被重定向到 OAuth2 服务器身份验证页面,他输入他的凭据,如果他成功通过身份验证,他将被重定向回带有 oauth 代码的 url。然后,他将进行第二次调用以从 OAuth2 服务器获取访问令牌。

现在的问题是,我们希望用户能够在应用程序中为页面添加书签直接访问它。如果他已经进行了身份验证,那么他将可以直接访问它(不再涉及身份验证)。否则,他将不得不进入 OAuth2 身份验证流程,但最终应该被重定向回他一开始打算访问的带有书签的页面。

我如何存储此页面 url 并在用户成功验证后重定向到它?

任何帮助将不胜感激。谢谢!

已编辑

初始 url 重定向是通过 javascript 的 document.location.href

完成的

【问题讨论】:

    标签: spring gwt authentication redirect oauth


    【解决方案1】:

    在 OAuth 2.0 Authorization Grant 流程中维护 原始 URI 的方法是在 state 参数中传递它,以便 重定向端点 可以在将 授权码 换成 访问令牌 后使用它来将用户重定向回该 URI。

    仅供参考,这正是 Google 在其 OAuth 2.0 文档中的示例中所建议的,例如https://developers.google.com/accounts/docs/OAuth2Login


    原答案:

    问题在于 place 使用 URL 的散列部分,该部分未发送到服务器,因此无法用于重定向到 OAuth2 服务器身份验证页面。

    您有 2 个(也许 3 个)解决方案:

    • 停止使用 place 的哈希值并切换到 HTML5 历史记录;通过History 级别的gwt-pushstatecustom PlaceHistoryHandler.Historian(如果您使用Places API)。不过,这会限制您的受众:http://caniuse.com/history

    • 停止使用 HTTP 重定向,而是使用 JavaScript,以便您可以将哈希放入 OAuth2 redirect_uri。所以不要重定向,而是发送一个带有适当脚本位的错误页面

    • 某些浏览器在重定向后将哈希附加到 URL,因此您的 OAuth2 服务器可能能够选择它(在 JavaScript 中)并将其附加到 redirect_uri。这可能取决于用于重定向的 HTTP 状态代码(根据经验,它适用于 301,但您不希望此处使用 301)。需要测试。

    【讨论】:

    • 其实所有的书签页面的逻辑都可以认为是解决了,因为我使用的是活动和地点。但真正的问题是如何拦截(也许使用 EventBus?)第一个传入请求的 url(如果用户尚未经过身份验证,这显然会失败),将其存储在客户端并将用户重定向到收到访问令牌后(认证成功后)
    • 重定向是客户端还是服务器端?
    • 我认为应该是客户端,因为我正在考虑在 OAuth2 流程结束时触发一个事件,以触发存储的 url 的重定向。我的意思是用户应该为 GWT-tokenized url 添加书签(比如这个:example.com/com.example.gwt.HistoryExample/…)所以我想它应该是客户端。
    • 应该是客户端还是服务器端是解决方案的一部分,而不是问题。它是当前客户端还是服务器端?如果是客户端(我对此表示怀疑),则使用Window.Location.getHref() 应用解决方案#2。
    • 对不起,我的错。您将在state 中传递您的位置(或原始URL),并且您的重定向端点将使用该state 将您重定向到适当的URL。请参阅developers.google.com/accounts/docs/OAuth2Login 中的示例
    【解决方案2】:

    您可以使用 GWT activities and places 执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 2018-03-28
      • 2012-08-12
      • 2011-09-15
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多