spring-security-oauth2 - 如何在 Spring OAuth2 服务器身份验证重定向中保留原始片段标识符

标签 spring-security-oauth2

我有一个带有 @EnableOAuth2Ssosecurity.oauth2.client.access-token-uri & 的客户端 @SpringBootApplication >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
  • 服务器/登录#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/

相关文章:

java - Spring Security + OAuth,如果访问 token 不存在则回退

spring-security - Spring Security OAuth2重定向循环

java - 为什么我的 token 被拒绝?什么是资源 ID? "Invalid token does not contain resource id (oauth2-resource)"

java - Spring Security 使用什么来生成 OAuth2 token ?

带有刷新 token 的 Keycloak 客户端凭据授予类型

Spring 安全: How to pass oauth2 access token in request headers

java - Spring Security OAuth2 舞蹈和获取参数

Java Spring 安全 : 401 Unauthorized for token OAuth2 end point

java - 使用外部登录页面的 Spring Security OAuth2 登录

java - Spring Boot 安全 Rest API