我的客户@SpringBootApplication
有@EnableOAuth2Sso
和security.oauth2.client.access-token-uri
& security.oauth2.client.user-authorization-uri
设置,以便使用授权码(非隐式!)将我的用户重定向到OAuth2服务器进行身份验证。
我的OAuth2服务器使用@EnableAuthorizationServer
和AuthorizationServerConfigurerAdapter
扩展类来设置服务器端的所有内容,只需很少的自定义。
现在我的客户端应用程序托管一个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
的表单,之后片段标识符将丢失。
如何将最终重定向中的片段标识符保留回用户?
答案 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
,但到目前为止这种方法是空的。如果其他人有工作版本,请随时捐款!