我试图从我的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()
)
我不知道如何让表单记录用户并重定向到其他应用程序主页.
提前致谢.
最佳答案 你在这里遇到了一个非常棘手的过程.你要做的是同时做两件事:
>登录外部服务
>重定向到用户的服务
从技术上讲,这不可能按照你想要的方式完成.这就是为什么:
你正在处理cookies.当您登录时,数据将存储为cookie /会话,以便在您浏览网站时记住您的身份.该信息也仅适用于相关域/路径,并且只能从相同的域/路径设置.
服务器而不是用户正在登录.
换句话说,您正尝试通过服务器将用户从另一个域登录到服务中.在这种情况下,服务器将代表用户登录(因为它是执行请求的服务器),但不会对cookie执行任何操作.即使我们将cookie发回给用户,他们也会在原始域名下申请,我们就不会再登录了.
解决方案1:简单但不安全
您可以做的是使重定向和登录过程相同.也就是说,使用诸如http://otherapplication.com/login?user=adomnom&pass=awesome的URL(尽管出于安全原因我强烈反对).
解决方案2:安全,但(你猜对了)很复杂
更安全的方法是使用您目前拥有的结构来生成一次性登录代码.也就是说,服务器将使用登录详细信息从另一个应用程序请求唯一的一次性“令牌”,并将其用作重定向的一部分.用户将被带到此其他页面,并使用此令牌作为凭据的替代登录.在此之后,令牌应该变为无效.
这样,另一个应用程序就是设置cookie并且没有直接传输敏感信息的应用程序.
这是我怎么做的……
1.在CakePHP端创建新端点:/ get-token
此端点将从GET数据接收用户名和密码,然后生成,存储和返回唯一令牌.
2.在CakePHP端扩展/登录以允许“令牌”GET变量
将’token’提交到/ 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");
}
希望有所帮助!祝好运!