2013-05-08 73 views
1

我正在使用HWI OAuth包允許用戶使用Google Apps登錄。它允許用戶按預期登錄。Symfony2 OAuth2登錄卡在無限重定向循環中

但是,大約5分鐘後,cookie過期並嘗試重定向到/ login,但它卡在無限重定向循環中。它試圖加載/登錄到端口443,但每次都返回302重定向到相同的URL。如果我清除服務器上的Symfony緩存或清除瀏覽器中的Cookie,它將顯示登錄頁面並重新運行。

// security.yml: 

firewalls: 
    secured_area: 
     anonymous:       ~ 
     oauth: 
      resource_owners: 
       google:      "/login/check-google" 
      oauth_user_provider: 
       service:     my.security.userprovider 
      login_path:      /login/ 
      failure_path:     /login/ 
     form_login: 
      login_path:      /login/ 
     logout: 
      path:       /logout 
      target:       /login/ 

access_control: 
    - { path: ^/(_(profiler|wdt)|css|images|js)/, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/connect, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/, role: ROLE_STAFF, host: %cms% } 

的網址是結構使得:在admin.example.com

  • 一切都被固定
  • 一切任何其他子域是公開的。子域是動態生成的。

nginx,Symfony2或FPM日誌中沒有任何內容。我已經將相同的代碼放在生產環境中的不同服務器上,並且發生同樣的事情。我無法弄清楚它是安全包,HWI OAuth包還是其中的一些東西。

所以,問題是哪種方法產生重定向,我該如何阻止它?

+0

在'{path:^ /,role:ROLE_STAFF,host:%cms%}','%cms%'是什麼意思? – cheesemacfly 2013-05-08 15:00:13

+0

@cheesemacfly它是'parameters.yml'中定義的一個參數,引用了admin.example.com的URL。 – 2013-05-08 16:28:28

+0

所以當你陷入無限循環時,主機是否匹配這個參數呢? – cheesemacfly 2013-05-08 16:36:24

回答

3

解決了它。用戶第一次登錄UserProvider::loadUserByOAuthUserResponse()時會收到一個包含用戶電子郵件地址的「UserResponse」。我正在使用它從我的數據庫加載用戶。

但是,每5分鐘它會通過檢查用戶的訪問令牌(存儲在用戶的會話中)再次檢查OAuth提供程序的令牌。這次UserResponse僅包含訪問令牌的含義是電子郵件地址爲空,因此無法找到用戶。這會拋出一個UsernameNotFoundException異常,但HWIOAuthBundle不會捕獲它。

因此,HWIOAuthBundle將一個空用戶對象返回給認證包,然後認證用戶需要進行認證以便重定向以進行登錄。由於用戶已擁有訪問令牌,因此它會針對OAuth提供商進行檢查,但不會返回電子郵件地址,因此無法找到該用戶,並重定向到登錄。因此,循環。

修復 - 將用戶的訪問令牌存儲在數據庫中,並嘗試通過訪問令牌加載用戶。

This gist was particularly useful in seeing how to build a working UserProvider