如何在Spring OAuth2服务器auth重定向中保留原始片段标识符

时间:2017-04-06 13:09:46

标签: spring-security-oauth2

我的客户@SpringBootApplication@EnableOAuth2Ssosecurity.oauth2.client.access-token-uri& security.oauth2.client.user-authorization-uri设置,以便使用授权码(非隐式!)将我的用户重定向到OAuth2服务器进行身份验证。

我的OAuth2服务器使用@EnableAuthorizationServerAuthorizationServerConfigurerAdapter扩展类来设置服务器端的所有内容,只需很少的自定义。

现在我的客户端应用程序托管一个Angular网站,该网站使用片段标识符进行导航。用户可以将包含这些片段标识符的URL加入书签/共享,以便稍后返回特定页面。但是,这些URL仅在用户已经过身份验证时才起作用,否则片段标识符将在OAuth2服务器重定向/登录舞蹈中丢失。

我已阅读以下博客文章以确定问题:
http://codetunnel.io/how-to-persist-url-hash-fragments-across-a-login-redirect/
简而言之:片段标识符永远不会发送到服务器,只能由浏览器在重定向中保留,但在POST请求中丢失。博客文章推荐使用客户端JavaScript将哈希片段插入登录表单redirect_uri字段中的解决方法。

我在将上述知识转化为我的申请时遇到了一些麻烦;我可以看到片段标识符保留在重定向中:

  • client/app#mypage 302
  • client/login#mypage 302
  • server/oauth/authorize#mypage 302
  • server/logon#mypage

最后一页是我的自定义程式化登录页面,我可以插入JavaScript代码。此页面包含一个POST到./logon的表单,之后片段标识符将丢失。

如何将最终重定向中的片段标识符保留回用户?

1 个答案:

答案 0 :(得分:0)

在解决上述问题的过程中,我能够(很容易)最终解决问题:

我(已经)覆盖/logon/oauth/confirm_access页面以注入一个小的JQuery JavaScript代码段:

// Manually insert the hash fragment to preserve angular app pages in redirect
// As per: http://codetunnel.io/how-to-persist-url-hash-fragments-across-a-login-redirect/
$(function () {
    var $form = $('#form');
    $form.attr('action', $form.attr('action') + window.location.hash);
});

这会将片段标识符附加到表单POST操作,这意味着浏览器会在整个登录过程中保留它,而不会将其发送到服务器。

我以前曾尝试使用自定义RedirectResolver,但到目前为止这种方法是空的。如果其他人有工作版本,请随时捐款!