创建与第三方站点单点登录的API

时间:2012-07-18 作者:emersonthis

我的网站需要与第三方软件集成,该软件将位于其自己的子域上,由软件公司托管。我需要为第三方开发人员提供一个端点,他们可以使用该端点进行API调用(到我的wordpress站点),以便允许我的站点用户访问子域。

另一个站点需要通过某种API对来自我的站点的用户进行身份验证。

我不知道从哪里开始,但我的感觉是,这已经被比我聪明的人弄明白了。提前感谢!

1 个回复
最合适的回答,由SO网友:Brian Fegter 整理而成

跨站点脚本问题

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

创建API端点查看我刚才在这里写的这篇文章:http://coderrr.com/create-an-api-endpoint-in-wordpress/

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

你必须为自己的应用程序需求找出逻辑,但这将允许你创建一个端点,在那里你可以从WordPress端提供任何你想要的东西。

由于您使用WordPress作为身份验证站点,因此可以使用类似is\\u user\\u logged\\u in()的检查。如果他们已登录,请将用户对象返回给第三方,并提供他们所需的任何信息。

从第三方登录,他们可以使用redirect\\u to query var链接到您的登录页面,以获得无缝体验。一旦登录,它会将它们传回第三方站点。

http://sub.yourdomain.com/wp-login.php?redirect_to=http%3A%2F%2Fwww.third-party-domain.com
远程登录如果您需要从第三方网站将用户登录到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!

结束