Symfony2安全 - 奇怪的行为(挑战性问题)

时间:2012-09-24 21:04:15

标签: security symfony oauth-2.0 fosuserbundle symfony-2.0

使用FOSOauthServerBundle,FOSUserBundle和Symfony2.0时,我跟踪this documentationhttp://blog.logicexception.com/2012/04/securing-syfmony2-rest-service-wiith.html)关于在使用FOSOAuthServerBundle实现OAuth2时创建自己的auth_login表单。顺便说一句,从我卑微的观点来看,这是一篇好文章。

我必须说我差不多完成了。但是有一种奇怪的行为使它无法发挥作用。谁能看看我的问题,并试着给我一个关于可能解决方案的线索?

以前的考虑因素

在开发本页面的说明之前,我已经配置了FOSOAuthServerBundle。我完成了这个过程,并且我正确地获得了令牌,验证了用户凭据并创建了会话。唯一的问题是我没有与我网站上的主要登录表单不同的特定登录表单。因此,尝试获取授权代码时出现的页面是正常登录页面。我想要的是,如手册中所述,显示不同的登录表单,更小,更具体,以使其对移动设备友好。

问题

准确开发本页描述的内容,我得到了这样的行为:

  1. 我使用适当的参数调用“^ / oauth / v2 / auth”
  2. 正如所料,我被重定向到/ auth_login页面
  3. 我输入了用户的凭据(正确的登录名和密码)
  4. 在登录过程之后,Symfony正确地尝试使用适当的参数再次重定向到“^ / oauth / v2 / auth”,但是,惊喜!!,某些拦截器或某些东西正在捕获该请求,我又一次重定向到/ auth_login。

    • 有趣的是会话已创建(我的意思是,如果在那一刻我在网址栏中输入网站中的任何现有页面,它会正常地重定向到所请求的页面,并创建所有会话和内容)。 **所以问题只在于“^ / oauth / v2 / auth”模式。无论我是否创建了会话,它总是会被拦截并重定向到/ auth_login(因此,我没有让工作流正确地去最终获得令牌。
  5. 唯一的区别

    在我拥有的内容和手册中描述的内容之间,我只是使用一个twig页面来显示auth_login表单。我不认为这可能是一个问题,但无论如何,我接下来发布它:

    <form action="{{ path("acme_oauth_server_auth_login_check") }}" method="post">
        <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
    
        <label for="username">{{ 'security.login.username'|trans({}, 'FOSUserBundle') }}</label>
        <input type="text" id="username" name="_username" value="{{ last_username }}" />
    
        <label for="password">{{ 'security.login.password'|trans({}, 'FOSUserBundle') }}</label>
        <input type="password" id="password" name="_password" />
    
        <input type="checkbox" id="remember_me" name="_remember_me" value="on" />
        <label for="remember_me">{{ 'security.login.remember_me'|trans({}, 'FOSUserBundle') }}</label>
    
        <input type="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans({}, 'FOSUserBundle') }}" />
    </form>
    

    还有一件事

    虽然它也不起作用,但我正在考虑一个技巧(或解决方法),其中包括将以下内容放在表单的action字段中:

    {{ path("fos_user_security_check") }}
    

    这意味着使/ auth_login表单将数据发送到FOSUserBundle而不是FOSOAuthServerBundle使用的相同login_check。

    在这种情况下的效果如下:

    1. 我使用适当的参数调用“^ / oauth / v2 / auth”
    2. 正如所料,我被重定向到/ auth_login页面
    3. 我输入了用户的凭据(正确的登录名和密码)
    4. 登录过程后,^ / oauth / v2 / auth的重定向工作正常,我获得了authorization_code
    5. 由于^ / oauth / v2 / token URL,我完成了获取access_token的所有内容
    6. 惊喜!!虽然一切都做得很好,但是在这种情况下会话不会被创建,这对以后调用API来说太糟糕了(由于没有创建会话,API不会得到任何东西)。想象一下,例如,我希望从API中获取属于输入其凭据的用户的某些项目的完整列表。显然,由于没有创建会话,我得到的只是重定向到主页面(因此我在symfony2上配置了防火墙)。
    7. 所以...一切都很奇怪。

      如果有人可以帮助我,我真的很感激。

      非常感谢

      佩德罗

0 个答案:

没有答案