我工作上的一个项目,该项目将使用facebook完全认证(没有定义的认证实存在的话)。项目采用PHP server-side脚本。我环顾四周,实现快速和安全认证机制,但我找不到任何详细说明关于这个问题。Facebook的文件是软弱的,不仅提供基本信息。

其认证的方法将是适当的?有一个Javascript SDK和PHP SDK。我的理解是,我必须使用Javascript SDK for登陆,然后使用PHP SDK我会检查我的数据库,用于验证的凭据。但是,使用图API with PHP SDK是缓慢的。是否有更好的方法来验证会议?

我需要检查的会议服务端(PHP-SDK)在每一个请求?

有帮助吗?

解决方案

与我所看到的任何其他方法相比,我最终为应用程序做的事情非常简单且相对较快。

  1. 检查签名_request如果存在,请解析它。如果没有,请将$登录标志设置为PHP中的1
  2. 我检查用户的会话 / cookie,以查看用户是否以前已由该应用程序进行身份验证(稍后会返回此。如果它为空,请将$登录设置为1。
  3. 如果将登录标志设置为1,请将用户发送到安装URL。
  4. 用户安装应用程序并发送到连接器页面。此页面的目的是获取access_token并为用户生成会话 / cookie。这意味着您不可能在用户会话的一生中检查此Access_Token的有效性。 Offline_access还创造了新的机会。您也可以将Access_Token存储在DB中。
  5. 每当您打电话给Facebook的电话时,请检查异常,如果您达到身份验证异常,请清除用户的会话和cookie。下次,即使用户看不见此过程,下次它将迫使他们更新其访问权限。

我已经在应用程序上完成了此操作,在大多数情况下,我不必向FB进行查询即可查看access_token的有效性,也不必在每个页面视图上不断获得它。我们的目标是减少应用程序的延迟,但是Facebook是最大的延迟来源,这样做大大减少了它。

其他提示

回答我自己的问题:

我使用JavaScript SDK检查Facebook身份验证。

  • 如果FB身份验证还可以,并且我的应用程序未经过身份验证,则我向用户介绍了Facebook的预注册形式。
  • 如果FB身份验证不正确,我会提供一个Facebook登录按钮。

注册插件授权我的应用程序,我致电我的fblogin.php使用PHP SDK检查此信息。当PHP SDK验证授权时,它将此信息存储在会话变量上。因此,无需在每个请求上检查FB身份验证。

登录按钮执行与注册插件相同。这些方法具有相同的服务器端功能,但它们的表示形式不同。

为了捕获Facebook注销状态,我使用JavaScript SDK在每个请求上验证Facebook身份验证。如果用户已登录,我的JS代码将调用fblogout.php,当前会话将被破坏。这种方法存在缺陷。如果用户不明确从我的网站注销,则攻击者可以代表用户仅在同一台计算机上禁用JS。

我找不到快速响应时间的更好解决方案。

您可以使用一个或另一个或两者兼而有之。

您可以使用PHP SDK来生成相关的URL将人们送往。然后将其插入链接上。或者,您可以使用JavaScript制作Facebook默认登录按钮。

之后,您可以使用一个或另一个来维护和验证会话。

我通常使用PHP来与OAuth Keys一起进行咕unt工作,并使用JavaScript SDK来制作不错的Facebook按钮和一些不太重要的图形调用,以进行会话监视。

我推向php的任何涉及任何重或多个图形调用的东西。

但是那里有灵活性可以做您想做的事。您不必使用JavaScript SDK进行登录。

是否要验证每个页面加载,取决于您。

我倾向于使用JavaScript SDK来处理它,如果会话已经死亡,就像Berk一样。将页面重定向到注销脚本。

作的最新版本,PHP和JS SDK现在都能够访问同用户一届会议(登录JS PHP[而不是具有做到这两点]).检查了 这篇文章 为了更详细的解释和一个例子。

如果你在担心安全,或许可以设置session cookie更快到期与 session_set_cookie_params().

首先,只需提醒您,您不仅需要保存access_token,而且理想情况下,您希望与访问令牌一起保存用户的Facebook UID。这是因为通常,您需要在API调用中将UID与访问令牌一起包含。

第二,来自 Facebook文档

注意:如果该应用程序尚未请求Offline_Access权限,则访问令牌是时地进行的。当用户从Facebook登录时,时间限制的访问令牌也会无效。如果该应用程序已从用户获得Offline_access的许可,则访问令牌没有到期。但是,每当用户更改其密码时,它就会无效。

第三,让access_token和uid的目的是执行API调用,对吗?从那里开始。 如果只有Access_Token(某种程度上)无效,请进行身份验证。 如何检查其是否有效?好吧,您可以使用卷发(参考) 或者 代理库(但是您可能需要对其进行修改,因为它最初是为CI编写的)将API调用作为验证proccess。样本(*叹气,使用我的代理库)...

// Suppose we are try to publish a status from our fb app
// $access_token hold the user access_token, which you saved into your database
// $uid hold the user facebook uid, which you saved into your database
$proxy = new Proxy;
// This is equal with perform regular HTTP POST request with cURL
$api_call = $proxy->http('post','https://graph.facebook.com/'.$uid.'/feed', array('access_token' => $access_token,'message' => 'foo'));

// Now we can validate...
// If the API success, it will be returned a post id, with json format
// if not, it will be outputing json like...
// "{"error":{"type":"OAuthException","message":"Invalid OAuth access token."}}"
// so...
$result = (array) json_decode($api_call);
if(array_key_exists('error', $result))
{
    // Here you can perform an oAuth authentification, to get fresh access_token and update your database
    // ...
    // After it done, process the previous api call with valid access_token
    $proxy->http('post','https://graph.facebook.com/'.$uid.'/feed', array('access_token' => $access_token,'message' => 'foo'));
}

Facebook Connect文档相当有限。它并没有真正告诉您它在做什么,只能做什么。我个人不使用任何一个SDK。我为自己的开发项目建立了自己的框架。

IMO中的SDK以及教程中的JavaScript都相当过时。

如果您想坚持使用其中一个FB SDK,这是我的建议。仅当您的图形API查询等通过AJAX发送到PHP后端时,才使用JS SDK。否则请坚持使用PHP SDK。

介绍

Facebook使用OAuth V2。他们描述了两种不同的流动方法...服务器端和客户端。这将与针对OAuth V2服务进行身份验证的任何其他应用程序相同。他们俩都做同样的事情。唯一的区别可能是您可以使用'代码'作为request_type获取以后获得代币的授权代码。

验证

就FB Connect而言,您的脚本需要确保您在需要身份验证时拥有验证令牌或验证代码。如果您没有那个,那么您需要得到它。您可以将验证代码或令牌的存在作为要显示的FB按钮(登录或注销)的条件。

将用户重定向到OAuth进行身份验证。 Facebook将其OAuth实施捆绑到了对话API中。有关OAuth对话框的更多信息: http://developers.facebook.com/docs/reference/dialogs/oauth/

您可以将可选状态参数用于诸如CSRF保护之类的东西。它保留该过程后的值,并以回调作为GET参数发送。

应用程序交互

基本上,您将按照通常的方式编写应用程序。差异将是:

  1. 您的用户数据库不再存储一个密码,仅存储FB UID。另外,根据FB Dev TOS,您确实无法存储任何用户信息。如果要存储用户信息,则需要从用户获取信息。您可以使用FB信息为他们填充此信息,您只需要提交信息即可。
  2. 您的注册方法将不再具有表格前端发布。当身份验证的用户没有DB中的条目时,它将被调用。

API相互作用

如果您使用代码而不是令牌,则需要通过发送代码请求令牌。这是通过图形API OAUTH完成的。除了其身份验证教程以外,根本没有记录此部分。 http://developers.facebook.com/docs/authentication/

使用您的访问令牌,无论您使用哪种方法来获取它。您现在可以根据需要查询图API。这将返回JSON编码对象。

结论

就快速安全的实施而言,Facebook PHP SDK可以完成这项工作。它处理我在这里涵盖的所有内容,包括CSRF。如何学习它,我还没有在上面找到体面的文档。一切都是旧的,要么作家并不真正知道,而且还没有其他教程。

最好的选择是在这些图书馆中进行深入研究,并弄清楚它如何为自己工作。进行一些反复试验,实验。

我学到的方式是为它编写自己的框架。我建议你这样做。如果愿意,您可以扩展Facebook SDK类。它确实有限,但它为您提供了所有需要的东西。我接了我最常用的API电话,并将其放入。我现在有一个非常简单,简单的最终结果,该结果是从我的库中驱动的。

我认为您不需要实现SDK。

1,您需要获得用户的许可,以访问他/她的数据。因此,您需要将它们重定向到Facebook。 PHP中的代码很少(3-5)行。

https://graph.facebook.com/oauth/authorize?
client_id=YOUR_APP_ID&scope=email&redirect_uri=APP_URL 

2,当用户返回您的网站时,随附$ _get ['code'

http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER

3,您必须通过Facebook获取请求来解码此代码,并获取access_token。

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&
client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

3,在使用access_token之后,只需运行A /ME吗?

4,您可以存储Facebook ID。

我认为这是最快的方法。据我所知,JavaScript SDK使用弹出窗口,大多数浏览器都会阻止。

此流程在这里足够详细: http://developers.facebook.com/docs/authentication/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top