Authentication Symfony2 OAuth2登录卡在无限重定向循环中

Authentication Symfony2 OAuth2登录卡在无限重定向循环中,authentication,symfony,oauth-2.0,Authentication,Symfony,Oauth 2.0,我正在使用HWI OAuth捆绑包允许用户使用Google应用程序登录。它允许用户按预期登录 然而,大约5分钟后,cookie过期,它试图重定向到/login,但它陷入了无限重定向循环。它试图在端口443上加载/登录,但每次都返回一个302重定向到相同的URL。如果我清除服务器上的Symfony缓存,或清除浏览器中的cookies,它将显示登录页面并再次工作 // security.yml: firewalls: secured_area: anonymous:

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

然而,大约5分钟后,cookie过期,它试图重定向到/login,但它陷入了无限重定向循环。它试图在端口443上加载/登录,但每次都返回一个302重定向到相同的URL。如果我清除服务器上的Symfony缓存,或清除浏览器中的cookies,它将显示登录页面并再次工作

// 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% }
URL的结构如下所示:

  • admin.example.com上的所有内容都是安全的
  • 任何其他子域上的所有内容都是公共的。子域是动态生成的
nginx、Symfony2或FPM日志中没有任何内容。我在生产环境中将相同的代码放在不同的服务器上,同样的事情也会发生。我无法确定它是安全包、HWI OAuth包还是介于两者之间的东西


所以,问题是哪个方法产生重定向,我如何停止它?解决了这个问题。用户首次登录
UserProvider::loadUserByOAuthUserResponse()
时,会收到包含用户电子邮件地址的“UserResponse”。我正在使用它从我的数据库加载用户

但是,每隔5分钟,它会通过检查用户的访问令牌(存储在用户会话中),再次检查OAuth提供者的令牌。这次,
UserResponse
只包含访问令牌,这意味着电子邮件地址为空,因此它找不到用户。这会抛出一个
UsernameNotFoundException
异常,但HWIOAuthBundle不会捕获它

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

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


.

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

但是,每隔5分钟,它会通过检查用户的访问令牌(存储在用户会话中),再次检查OAuth提供者的令牌。这次,
UserResponse
只包含访问令牌,这意味着电子邮件地址为空,因此它找不到用户。这会抛出一个
UsernameNotFoundException
异常,但HWIOAuthBundle不会捕获它

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

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


.

{path:^/,role:role_STAFF,host:%cms%}
中,您所说的
%cms%
是什么意思?@cheesemacfly它是在
parameters.yml
中定义的参数,指的是admin.example.com URL。因此,当您陷入无限循环时,主机是否匹配此参数?@cheesemacfly是的,它匹配主机名。因此,无限重定向循环在我登录时发生(在登录时)。大约5分钟后,它在尝试加载时被卡住。因此,我可能遗漏了一些内容,但当您有此
{path:^/,role:role\u STAFF,host:%cms%}
时,它要求您处于角色
role\u STAFF
中才能访问
^//code>,当您未登录时,这是错误的。因此,当您注销时,它无法到达
/login/
,因为它位于
^/
下。在
{path:^/,role:role\u STAFF,host:%cms%}
中,您所说的
%cms%
是什么意思?@cheesemacfly它是
parameters.yml
中定义的参数,参考admin.example.com URL。因此,当您陷入无限循环时,主机是否与此参数匹配?@cheesemacfly是,它与主机名匹配。因此,无限重定向循环在我登录时发生(在登录时)。大约5分钟后,它在尝试加载时被卡住。因此,我可能遗漏了一些内容,但当您有此
{path:^/,role:role\u STAFF,host:%cms%}
时,它要求您处于角色
role\u STAFF
中才能访问
^//code>,当您未登录时,这是错误的。因此,当您注销时,它无法到达
/login/
,因为它位于
^/
下。