【问题标题】:Gravity forms submit to third party and redirect using wp_http()重力表单提交给第三方并使用 wp_http() 重定向
【发布时间】:2014-10-04 22:23:55
【问题描述】:

我正在尝试从我的 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'] ); }

表单的确认设置是显示一些文本。但我本质上想要它做的是将用户登录到另一个应用程序并显示该应用程序的主页,即重定向到 URL“http://otherapplicationurl.com/home”。

我不断收到以下错误。


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

            )

        [error_data] => Array()

    )

我不知道如何获取表单以使用户登录并重定向到其他应用程序主页。

提前致谢。

【问题讨论】:

    标签: wordpress gravity-forms-plugin


    【解决方案1】:

    您在这里遇到了一个非常棘手的过程。您正在尝试同时做两件事:

    1. 登录外部服务
    2. 将用户重定向到服务

    从技术上讲,这不能按照您希望的方式完成。原因如下:

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

    正在登录的是服务器,而不是用户。 换句话说,您正试图通过服务器将用户从另一个域登录到服务。在这种情况下,服务器将代表用户登录(因为它是服务器发出请求),但不会对 cookie 做任何事情。即使我们将 cookie 发回给用户,它们也会在原始域下应用,并且我们不会更接近登录。

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

    您可以做的是将重定向和登录过程设为同一件事。也就是说,使用诸如 http://otherapplication.com/login?user=adomnom&pass=awesome 之类的 URL(尽管出于安全原因,我强烈不鼓励这样做)。

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

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

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

    这就是我的做法......

    1.在 CakePHP 端创建新端点:/get-token

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

    2。在 CakePHP 端扩展 /login 以允许“令牌”GET 变量

    向 /login 提交“令牌”还应登录用户并删除令牌 - 防止再次使用它。

    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");
    }
    

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

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 2011-01-22
      • 2012-11-18
      • 2012-11-25
      • 1970-01-01
      • 2013-04-13
      • 2021-02-15
      • 2011-12-26
      • 1970-01-01
      相关资源
      最近更新 更多