Php Facebook身份验证实现

Php Facebook身份验证实现,php,authentication,facebook-graph-api,facebook-php-sdk,facebook-javascript-sdk,Php,Authentication,Facebook Graph Api,Facebook Php Sdk,Facebook Javascript Sdk,我正在做一个完全使用facebook身份验证的项目(不存在自定义身份验证实现)。Project使用PHP编写服务器端脚本。我四处寻找实现快速安全的身份验证机制,但找不到关于这个主题的任何详细描述。Facebook的文档很弱,只提供基本信息 哪种身份验证方法合适?有一个Javascript SDK和PHP SDK。据我所知,我必须使用Javascript SDK进行登录,然后使用PHP SDK检查我的数据库以验证凭据。但是在PHPSDK中使用GraphAPI速度很慢。是否有更好的方法验证会话 我是

我正在做一个完全使用facebook身份验证的项目(不存在自定义身份验证实现)。Project使用PHP编写服务器端脚本。我四处寻找实现快速安全的身份验证机制,但找不到关于这个主题的任何详细描述。Facebook的文档很弱,只提供基本信息

哪种身份验证方法合适?有一个Javascript SDK和PHP SDK。据我所知,我必须使用Javascript SDK进行登录,然后使用PHP SDK检查我的数据库以验证凭据。但是在PHPSDK中使用GraphAPI速度很慢。是否有更好的方法验证会话


我是否需要检查每个请求的会话服务器端(PHP-SDK)?

回答我自己的问题:

我使用Javascript SDK检查facebook身份验证是否可用

  • 如果fb身份验证正常,而我的应用程序没有经过身份验证,我会向用户提供一份预填的facebook注册表
  • 如果fb身份验证不正常,我会显示一个facebook登录按钮
注册插件授权我的应用程序,我调用我的fblogin.php使用php SDK检查此信息。当PHP SDK验证授权时,它将此信息存储在会话变量中。因此,无需在每个请求上检查fb身份验证

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

为了捕获facebook注销状态,我使用Javascript SDK对每个请求验证facebook身份验证。若用户注销,我的js代码将调用fblogout.php并销毁当前会话。这种方法有一个缺陷。如果用户没有明确地从我的网站注销,攻击者可以代表用户做任何事情,只在同一台机器上禁用js


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

您可以使用其中一个或两个

您可以使用PHPSDK生成相关的URL以将用户发送到。只要在一个链接上摇动它。 或者您可以使用Javascript使Facebook成为默认登录按钮

之后,您可以使用其中一个来维护和验证会话

我通常使用PHP与oAuth键一起进行grunt工作,并使用JavaScript SDK制作漂亮的Facebook按钮和一些不太重要的用于会话监视的图形调用

任何涉及大量或多个图形调用的内容,我都会推送到PHP

但你可以灵活地做你想做的事。登录时不必使用JavaScript SDK

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


我倾向于使用javascriptsdk来处理它,如果会话死机,我喜欢Berk。调用页面重定向到注销脚本。

从最新版本开始,PHP和JS SDK现在都可以访问相同的用户会话(使用JSPHP登录[而不必同时执行这两个操作])。查看更详细的解释和示例


如果您担心安全性,也许可以使用将会话cookie设置为提前过期。

我认为您不需要实现SDK

1,您需要获得用户的权限才能访问他/她的数据。所以你需要将他们重定向到Facebook。php中只有很少(3-5)行代码

https://graph.facebook.com/oauth/authorize?
client_id=YOUR_APP_ID&scope=email&redirect_uri=APP_URL 
2、当用户返回您的站点时,请提供$\u GET['code']

http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER
3.你必须通过Facebook get request解码此代码,并获得access_令牌

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、在您拥有访问令牌后,只需根据需要运行a/me?访问令牌GET请求,以检查用户是否仍然存在

4、你可以储存Facebook ID

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


这个流程在这里已经足够详细了:

与我见过的任何其他方法相比,我最终为我的应用程序所做的工作都非常简单,速度也相对较快

  • 检查签名的_请求(如果存在),如果存在,则对其进行解析。如果没有,请在PHP中将$login标志设置为1
  • 我检查用户的会话/cookie,以查看该用户之前是否已通过应用程序的身份验证(稍后将返回此操作。如果为空,请将$login设置为1)
  • 如果登录标志设置为1,则将用户发送到安装url
  • 用户安装应用程序并发送到连接器页面。此页面用于获取访问令牌并为用户生成会话/cookie。这意味着您可能不需要在用户会话的生命周期内检查此访问令牌的有效性。脱机访问也会创建新的机会。您可以存储访问令牌_您的数据库中也有令牌
  • 无论何时你接到Facebook的电话,都要检查异常情况,如果遇到身份验证异常,请清除用户的会话和cookie。下次它将强制用户更新其访问令牌,即使用户看不到该过程

  • 我已经在我的应用程序上这样做了,在大多数情况下,这意味着我不必向FB查询访问令牌的有效性,也不必在每个页面视图上不断获取它。我们的目标是减少应用程序的延迟,但Facebook是延迟的最大来源,这样做可以大大减少延迟。

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

    第二,来自

    注意:如果应用程序未请求脱机访问权限, 访问令牌是有时间限制的。有时间限制的访问令牌也可以 当用户注销Facebook时无效。如果应用程序 已从用户获得脱机访问权限,访问令牌 没有到期日。但是
    // 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'));
    }