问题描述

我的网站需要与第三方软件集成,该软件将由软件公司主办的自己的 sub-domain 。我需要向第三方开发人员提供一个端点,以便让我的站点的用户访问 sub-domain 。

另一个网站需要通过某种 API 对我的网站进行身份验证。

我不知道从哪里开始,但我的意思是这个人比我聪明得多。提前致谢!

最佳解决方案

Cross-site 脚本问题

您无法在域之间传输 WP 验证 Cookie 。您也不想存储明文密码以编程方式登录到其他 WP 安装。因此,您必须让用户登录到 WordPress,然后通过 API 从 third-party 站点访问其登录状态。这让 WordPress 处理所有的身份验证。这是非常安全的,因为用户将不得不身体登录到 WP 端,以便 API 端点将数据提供给 third-party 。

创建 API 端点

看看这篇文章我刚才在这里写:http://coderrr.com/create-an-api-endpoint-in-wordpress/

此外,您可以在此处看到代码演示:https://gist.github.com/2982319

您必须找出自己的应用程序需求的逻辑,但这将允许您创建一个端点,您可以从 WordPress 端提供任何您想要的内容。

由于您使用 WordPress 作为身份验证站点,您可以使用像 is_user_logged_in() 这样的检查。如果他们登录,则用任何他们需要的信息将用户对象返回给第三方。

从 Third-Party 登录

从 third-party,他们可以使用 redirect_to 查询 var 链接到您的登录页面以获得无缝体验。一旦登录,它将传递回 third-party 站点。

http://sub.yourdomain.com/wp-login.php?redirect_to=http%3A%2F%2Fwww.third-party-domain.com

远程登录

如果您需要从 third-party 站点登录用户到 WordPress,您可以使用本站列出的一些简单的 WP 功能:http://kuttler.eu/code/log-in-a-wordpress-user-programmatically/

您一定需要使用共享的秘密,并创建基于时间的散列密码来保护安全。基本上,这就是它的样子:

第三方发送具有时间戳和由共享密钥生成的令牌的请求:

$shared_secret = 'foobar'; //do not send this to the API endpoint
$timestamp = time();
$token = md5($shared_secret.$time_stamp);

WordPress 安装接收请求:

$shared_secret = 'foobar';
$timestamp = esc_attr($_GET['timestamp']);

if((time() - $timestamp) > 30) # Threshold is 30 seconds
    //do something here - TOKEN expired!

$token = md5($share_secret.$timestamp);
$token_to_check = esc_attr($_GET);

if($token == $token_to_check)
    //authenticated!

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。