使用 FOSOauthServerBundle、FOSUserBundle 和 Symfony2.0,我遵循了这个文档(http://blog.logicexception.com/2012/04/securing-syfmony2-rest-service-wiith.html)关于在实现 OAuth2 时创建自己的 auth_login 表单使用 FOSOAuthServerBundle。好帖子,顺便说一句,从我谦虚的角度来看。
我必须说我几乎完成了。但是有一种奇怪的行为使它不起作用。任何人都可以看看我的问题并尝试给我一个关于可能解决方案的线索吗?
以前的考虑
在开发此页面上的说明之前,我已经很好地配置了 FOSOAuthServerBundle。我完成了该过程,并正确获取了令牌,验证了用户凭据并创建了会话。唯一的问题是我没有与我网站上的主要登录表单不同的特定登录表单。所以尝试获取授权码时出现的页面就是正常的登录页面。我想要的是,如手册中所述,显示一个不同的登录表单,更小更具体,使其对移动设备友好。
问题
准确开发此页面上描述的内容,我得到了这种行为:
- 我用正确的参数调用“^/oauth/v2/auth”
- 正如所料,我被重定向到 /auth_login 页面
- 我输入了用户的凭据(正确的登录名和密码)
在登录过程之后,Symfony 正确地尝试使用正确的参数再次重定向到“^/oauth/v2/auth”,但是,惊喜!!,一些拦截器或其他东西正在捕获该请求,我再次被重定向到 /auth_login。
- 有趣的是会话已创建(我的意思是,如果在那一刻我在 url 栏中的站点中键入任何现有页面,它通常会重定向到创建所有会话和内容的请求页面)。** 所以问题只是模式“^/oauth/v2/auth”。无论我是否创建了会话,它总是会被拦截并重定向到 /auth_login (并且,因此,我没有让工作流以最终获得令牌的方式正确运行。
唯一的区别
在我所拥有的和手册中描述的之间只是我使用树枝页面来显示 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>
还有一件事
虽然它也不起作用,但我正在考虑一个技巧(或解决方法),包括将以下内容放在表单的操作字段中:
{{ path("fos_user_security_check") }}
这意味着使 /auth_login 表单将数据发送到 FOSUserBundle 使用的相同 login_check 而不是 FOSOAuthServerBundle 的。
这种情况下的效果如下:
- 我用正确的参数调用“^/oauth/v2/auth”
- 正如所料,我被重定向到 /auth_login 页面
- 我输入了用户的凭据(正确的登录名和密码)
- 在登录过程之后,^/oauth/v2/auth 的重定向很好,我得到了授权码
- 由于 ^/oauth/v2/token URL,我完成了获取 access_token 的整个过程
- 惊喜!!尽管一切都做得很好,但在这种情况下,没有创建会话,这对于以后调用 API 来说太糟糕了(API 只是没有得到任何东西,因为没有创建会话)。想象一下,例如,我想从 API 获取属于输入其凭据的用户的某些项目的完整列表。显然,由于没有创建会话,我得到的只是重定向到主页(这就是我在 symfony2 上配置防火墙的方式)。
所以……一切都那么奇怪。
如果有人能帮助我解决这一切,我将不胜感激。
非常感谢
佩德罗