【问题标题】:Pass an array without displaying it in url传递一个数组而不在 url 中显示它
【发布时间】: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 方法来获取密码、用户隐私数据等。

标签: php arrays forms symfony


【解决方案1】:

既然我知道你在做什么,我会考虑在你第一次收到数据时将数据存储在 php 的$_SESSION 中。不要费心来回发送它。这不仅是骇人听闻的,而且容易被篡改,尤其是如果您没有在 Linedin 最有可能出现的地方运行 https。

编码愉快!

【讨论】:

  • 我正要再次评论您的第一个答案,以支持此选项而不是表单中的隐藏输入。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
相关资源
最近更新 更多