重力表单提交给第三方并使用wp_http()重定向

时间:2014-08-12 00:09:57

标签: wordpress wordpress-plugin gravity-forms-plugin

我正在尝试从我的wordpress网站获取重力表格作为另一个应用程序(CakePhp网站)的登录表单。表单有两个字段 - 用户名和密码。我添加了一个钩子,使用gform_after_submission将表单提交给另一个应用程序,如下所示:



    add_action( 'gform_after_submission_6', 'mysite_gform_after_submission', 10, 2 ); 

    function mysite_gform_after_submission( $entry, $form ) {

     $post_url = 'http://otherapplicationurl.com/login';

     $body = array(
            "data[User][username]" => $entry[1], 
            "data[User][password]" => $entry[2], 
     );

        $request = new WP_Http();
        $response = $request->post($post_url, array('body' => $body));
    //this is to delete the entry

    GFAPI::delete_entry( $entry['id'] );
    }


表单的确认设置是显示一些文本。但我基本上希望它做的是将用户登录到另一个应用程序并显示该应用程序的主页,即重定向到网址" http://otherapplicationurl.com/home"。

我一直收到以下错误。


    WP_Error Object
    (
        [errors] => Array
            (
                [http_request_failed] => Array
                    (
                        [0] => Too many redirects.
                    )

            )

        [error_data] => Array()

    )

我不知道如何让表单记录用户并重定向到其他应用程序主页。

提前致谢。

1 个答案:

答案 0 :(得分:2)

你在这里遇到了一个非常棘手的过程。你要做的是同时做两件事:

  1. 登录外部服务
  2. 将用户重定向到服务
  3. 从技术上讲,这不可能按照你想要的方式完成。这就是原因:

    您正在处理Cookie。当您登录时,数据会存储为Cookie /会话,以便在您浏览网站时记住您的身份。该信息也仅适用于相关域/路径,并且只能从相同的域/路径设置。

    服务器而非用户正在登录。 换句话说,您正尝试通过服务器将用户从另一个域登录到服务中。在这种情况下,服务器将代表用户登录(因为它是执行请求的服务器),但不会对cookie执行任何操作。即使我们将cookie发回给用户,他们也会在原始域名下申请,我们也不会接近登录。

    解决方案1:简单但不安全

    您可以做的是使重定向和登录过程完全相同。也就是说,使用http://otherapplication.com/login?user=adomnom&pass=awesome之类的网址(虽然我强烈出于安全原因而不鼓励这样做)。

    解决方案2:安全,但(您猜对了)复杂

    更安全的方法是使用您目前拥有的结构来生成一次性登录代码。也就是说,服务器将使用登录详细信息从另一个应用程序请求唯一的一次性“令牌”,并将其用作重定向的一部分。用户将被带到此其他页面,并使用此令牌作为凭据的替代登录。在此之后,令牌应该变为无效。

    这样,另一个应用程序是设置cookie的应用程序,并且没有直接传输敏感信息。

    这就是我要做的事情......

    <强> 1。在CakePHP端创建新端点:/ get-token

    此端点将从GET数据接收用户名和密码,然后生成,存储并返回唯一令牌。

    <强> 2。在CakePHP端扩展/登录以允许“令牌”GET变量

    向/ login提交'token'也应该登录用户并删除令牌 - 防止再次使用它。

    第3。更新提交过程以使用正确的挂钩

    您需要使用 gform_confirmation 挂钩来执行此操作 - 它是处理重定向和感谢页面内容的钩子(即用户显示的内容)提交表格)。

    add_action( 'gform_confirmation_6', 'mysite_gform_confirmation', 10, 3 ); 
    
    function mysite_gform_confirmation( $confirmation, $form, $entry ) {
    
        // Send login request
        $token = wp_remote_post(
            'http://otherapplicationurl.com/login',
            array(
                'body' => array(
                    "data[User][username]" => $entry[1], 
                    "data[User][password]" => $entry[2]
                )
            )
        );
    
        // Delete entry
        GFAPI::delete_entry( $entry['id'] );
    
        // Redirect
        return array('redirect', "http://otherapplicationurl.com/login?token=$token");
    }
    

    希望有所帮助!祝你好运!