2

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

然而,大约 5 分钟后,cookie 过期并尝试重定向到 /login,但它陷入了无限重定向循环。它试图在端口 443 上加载 /login,但每次都返回一个 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 捆绑包还是介于两者之间的东西。

那么,问题是哪种方法正在产生重定向,我该如何阻止它?

4

1 回答 1

4

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

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

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

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

这个要点在了解如何构建一个有效的 UserProvider 时特别有用

于 2013-05-15T08:38:50.573 回答