我正在开发一个网站,其中有很大一部分用户通过Facebook Connect登录,因此他们没有我们网站的用户名和密码。我们使用基本身份验证提供我们自己的用户身份验证API,但这不允许Facebook连接用户使用我们的API对客户端进行身份验证。
有没有办法不破坏Facebook的TOS授权使用Facebook身份验证凭据的其他第三方?例如,如果其他站点实现了facebook连接并将会话数据传回给我们?除了使用oAuth作为解决方案的Foursquare等网站之外的API提供商成功使用facebook连接时,是否有任何例子?
答案 0 :(得分:4)
我为我的应用程序开发了这样一个功能。用户可以在我们的网络前面使用Facebook或Twitter登录,他们也可以通过iPhone / Android应用程序在我们的API上以相同的方式进行身份验证。
我不确定我的方法是最好的,这就是为什么我asked the question关于什么是最好的方法。不过,我将解释我正在做的事情,到目前为止,这项工作非常顺利。
首先,您需要在API中实现login
方法。此方法会根据API令牌交换您的凭据,然后将其用于所有将来的呼叫。
以下是login
API调用以及您的基本身份验证参数:
http://login:password@api.myapp.com/login
(这只是一个表示你要发送凭据的表示,而不是实际的方式)
作为回报,此API调用会向您发送api_token
{ "api_token": "xxxx-xxxx-xxxx-xxxx" }
服务器端,您有一个关联api_token
和user_id
的表格(如果需要还有截止日期等)
每次需要进行身份验证时,您都会使用api_token
:
http://api.myapp.com/request?api_token=xxxx-xxxx-xxxx-xxxx
现在您已经修改了身份验证实现,您将对Facebook Connect SDK发回的Facebook access_token
执行完全相同的操作。您使用以下API调用交换令牌:
http://api.myapp.com/login/facebook?access_token=<facebook_access_token>
服务器端,您使用简单的
验证access_token
的有效性
wget -qO- https://graph.facebook.com/me?access_token=<facebook_access_token>
它会向您发送包含所有用户信息的JSON,包括用户的Facebook ID。假设用户已将其帐户连接到Facebook,您可以查找user_id
并发回api_token
。
问题是如果用户拒绝来自Facebook的应用程序,这对api_token
没有任何影响,用户仍然可以访问API。可能还存在一些安全问题(https肯定会更好地保护用户的facebook访问令牌)。
我无法保证这种方法的美观,但它可以工作,并可以与许多其他供应商一起使用。由于Facebook访问令牌停留在同一个生态系统中,我很确定这并不违反Facebook的TOS。我没有看到任何反对它的东西。