我正在使用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% }
网址结构如下:
nginx,Symfony2或FPM日志中没有任何内容。我在生产环境中将相同的代码放在不同的服务器上,同样的事情发生了。我无法确定它是安全捆绑包,HWI OAuth捆绑包还是介于两者之间的东西。
所以,问题是哪个方法产生重定向,我该如何阻止它?
答案 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