我有一个带有 @EnableOAuth2Sso
和 security.oauth2.client.access-token-uri
& 的客户端
设置,以便将我的用户重定向到我的 OAuth2 服务器,以便使用授权代码进行身份验证(不是隐式的!)。@SpringBootApplication
>security.oauth2.client.user-authorization-uri
我的 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
302client/login#mypage
302server/oauth/authorize#mypage
302服务器/登录#mypage
最后一页是我的自定义风格化登录页面,我可以在其中插入 JavaScript 代码。此页面包含一个 POST 到 ./logon
的表单,之后片段标识符就会丢失。
如何在最终重定向回用户时保留片段标识符?
最佳答案
在解决上述问题的过程中,我最终能够(非常轻松地)解决问题:
我(已经)覆盖了 /logon
和 /oauth/confirm_access
页面以注入(inject)一个小的 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
,但到目前为止该方法都是空的。如果其他人有工作版本,请随时贡献!
关于spring-security-oauth2 - 如何在 Spring OAuth2 服务器身份验证重定向中保留原始片段标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43256194/