【发布时间】:2013-12-12 15:38:46
【问题描述】:
我想做什么:
我目前正在我的 symfony2 应用上通过 LinkedIn OAuth 安装身份验证。
在我的 userController 中,我有一个用于获取linkedin 数据的函数,以及另一个用于创建新用户的函数。
这创建一个新的用户函数可以处理linkedin用户(通过数组作为参数传递的帮助)和非linkedin用户(通过POST请求中的表单):
public function createUserAction($from_linkedin = false, $linkedin_data = null)
{
$user = new User();
if(!from_linkedin) {
// User comes from the registration form
$user = $post_data,
} else {
// User comes from linkedin OAuth
$user = $linkedin_data;
}
$em->persist($user);
$em->flush();
}
我想让我的linkedin OAuth 用户选择一个密码,以便他们将来可以使用linkedin 或标准电子邮件/密码表单进行连接。我也觉得这样更安全。
为了做到这一点,我创建了一个中间函数来向用户显示密码表单。这个表单显示在linkedin调用之后,注册函数之前
protected function chosePasswordAction($linkedin_data)
{
$form = createForm(new ChosePasswordType);
if($method = POST) {
$linkedin_data["password"] = $post_data["password"];
return createUserAction(true, $linkedin_data);
}
return $this->renderView("chosePassword.html.twig", array(
'form' => $form,
'data' => $linkedin_data,
));
}
我的问题是什么:
表单显示得很好,但是当我在 POST 请求中从它返回时出现错误。缺少 $linkedin_data 数组,因此 selectedPassword() 函数返回错误:
Controller "Bundle\Controller\UserController::chosePasswordAction()"
requires that you provide a value for the "$linkedin_data" argument
(because there is no default value or because there is a non optional
argument after this one).
我知道的唯一方法是将 $linkedin_data 数组作为参数添加到表单路由中,但它一点也不安全。我怎样才能轻松无风险地通过它?
【问题讨论】:
-
是否发生了两个请求?您是否将linkedin数据传递回密码表单?您可以将数据存储在服务器端,直到他们设置密码,然后附加密码/身份验证数据,或者您必须通过隐藏输入将其发送回用户的设置密码表单,并在他们重新处理链接数据时- 提交到你的服务器。
-
您是说当您执行 GET 请求而不是 POST 时一切正常?
-
@Fydo:将linkedin数据传递给密码表单是我想要实现的。在这种情况下,通过隐藏的输入发送它看起来是最好的选择,即使对于应用程序的如此敏感的部分来说它感觉有点骇人听闻。不过,您的回答证实了我的第一个直觉,我会试一试 - 谢谢;)。
-
@MrLister 不,我只在这里处理 POST,在这种情况下,我宁愿不使用任何 GET 方法来获取密码、用户隐私数据等。