繁体   English   中英

Spring Security OAuth2 使用外部登录页面登录

[英]Spring Security OAuth2 Login using External Login Page

我想知道是否可以将 Spring Security 配置为在 OAuth 登录过程中使用外部托管的登录页面。 没关系,这不是一个好主意,并且违背了 OAuth 的目的之一(将登录/凭据/身份验证问题与客户端和资源服务器分开)。

我有以下设置:

  • 客户端 SPA 应用程序,我要使用的登录页面所在的位置
  • OAuth @EnableAuthorizationServer验证服务器(使用 Spring Security OAuth / @EnableAuthorizationServer
  • 一台或多台 OAuth 资源服务器

我寻求的 OAuth 流程如下:

  • 用户尝试访问 SPA 中的安全路由
  • 客户端将用户重定向到 OAuth 服务器的授权页面(参数包括 state、nonce 等)
  • OAuth 服务器未检测到令牌并重定向到 SPA 的登录页面
  • 用户登录; 发布到登录 url(登录 url 位于 OAuth 服务器上;需要 CORS 配置以允许从 SPA 到 OAuth 服务器的跨域发布)
  • 登陆成功; Spring使用原来存在的参数重定向到最初请求的授权页面
  • 授权重定向到令牌; 用户获得令牌; SPA 检测到用户现在拥有令牌并允许访问安全路由

我可以配置 Spring Security 来指定一个绝对 url,以便重定向到我的 SPA 登录页面:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors()
        .and()
        ... config ...
        .and()
        .formLogin()
        .loginPage("http://angular-spa-app/login") 
        .loginProcessingUrl("/login")
        .permitAll();
}

当我完成这个流程时,我看到第一个请求是向oauth/authorize?state=...&nonce=...&etc... ,然后重定向到http://angular-spa-app/login 但是当我登录时,Spring 无法检测到它应该重定向回会话中保存的oauth/authorize url。

进一步深入研究,我发现当第一个请求oauth/authorize ,带有 params 的完整 url 保存在会话中( HttpSessionRequestCache.saveRequest(...)

当登录表单提交并且身份验证成功时,Spring 会尝试检索保存的请求以获取重定向 url 作为 302 Location 标头发送。 但是当它这样做时,会话为空,因此 Spring 无法检索任何保存的请求。 为什么是这样? 我是否需要修改 Spring 会话设置才能解决此问题?

问题根本不在于 Spring Security; 它是与 Angular SPA 一起使用的。 在从 Angular 应用程序将跨域 POST 发回 /login 时,我需要发送 JSESSION_ID cookie。

为此,我创建了一个HttpInterceptor如此处所述):

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor() {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    request = request.clone({
      withCredentials: true
    });
    return next.handle(request);
  }
}

withCredentials: true位是重要的部分; 这会指示浏览器将 cookie 与 XHR 请求一起发送。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM