为第三方网站创建用于单点登录的API


13

我的网站需要与第三方软件集成,该软件将驻留在该软件公司托管的自己的子域中。我需要向第三方开发人员提供一个端点,他们可以使用该端点进行API调用(对我的wordpress网站),以允许我的网站的用户访问该子域。

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

我不确定从哪里开始,但是我的感觉是,比我聪明的人已经知道了这一点。提前致谢!


1
需要什么样的API调用?你想做什么?您是否看过WP的XML-RPC支持(codex.wordpress.org/XML-RPC_Support)?
2012年

另一个站点需要从我的WP站点验证/验证用户。
emersonthis 2012年

Answers:


16

跨站点脚本问题

您不能在域之间传输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_user_logged_in()之类的检查。如果他们已登录,则将用户对象及其所需的任何信息返回给第三方。

从第三方登录

他们可以从第三方链接到您的登录页面,以使用redirect_to查询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!

可以肯定的是,第三方软件与WP无关,因此本质上它是单点登录,但是由WP充当身份验证提供程序。
2012年

@anu:是的。
emersonthis 2012年

@Brian:我对切换到多站点安装的想法很感兴趣,但是我不完全理解您对Cookie的看法。所有需要发生的事情是第三方软件需要验证其用户实际上是我的用户之一。该软件在其他方面是自给自足的,可以提供自己的cookie或其他内容。
emersonthis 2012年

@Emerson我现在看到了。对困惑感到抱歉。您可以使用我创建的端点构想,并在用户meta中使用共享令牌进行身份验证。如果用户存在,则将JSON响应返回给第三方。
布莱恩·菲格特

1
非常好的解决方案。如果将应用程序安装在不同的服务器上,并且由于某些原因每台计算机的时间不同,可能会出现问题。我建议使用counter代替,time()并将其与请求一起传递。双方保持最后一个计数器通过,并且当api收到带有新计数器的请求时,它将验证新计数器大于最后一个计数器。这样,延迟不会造成任何伤害。
guyaloni 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.