Symfony2 OAuth2登录陷入无限重定向循环

时间:2013-05-08 07:13:02

标签: authentication symfony oauth-2.0

我正在使用HWI OAuth捆绑包来允许用户使用Google Apps登录。它允许用户按预期登录。

但是,大约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捆绑包还是介于两者之间的东西。

所以,问题是哪个方法产生重定向,我该如何阻止它?

1 个答案:

答案 0 :(得分:4)

解决了这个问题。用户首次登录UserProvider::loadUserByOAuthUserResponse()时会收到包含用户电子邮件地址的“UserResponse”。我正在使用它从我的数据库加载用户。

但是,每隔5分钟,它会通过检查用户的访问令牌(存储在用户的会话中)再次检查令牌与OAuth提供程序。这次UserResponse仅包含 访问令牌,这意味着电子邮件地址为空,因此无法找到用户。这会引发UsernameNotFoundException异常,但HWIOAuthBundle无法捕获它。

因此,HWIOAuthBundle将一个null用户对象返回到Authentication包,然后该包识别用户需要进行身份验证,以便重定向到login。由于用户已经拥有访问令牌,因此它会针对OAuth提供商进行检查,但同样不会返回电子邮件地址,因此无法找到用户,并且会重定向到登录。因此循环。

修复 - 将用户的访问令牌存储在数据库中,并尝试通过访问令牌加载用户。

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