簡體   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