0

我自己使用 Facebook PHP SDK。我根本不想使用 JS SDK。

因为 getUser(); 即使用户未登录,SDK 也可以返回用户 ID,我选择使用 try/catch 语句来检查用户是否已登录。

    try
{
    $me = $CI->facebook->api('/me');
    $CI->our_fb['is_fb']='YES';
    echo "hello";
}
    catch(FacebookApiException $e) 
{               
    echo "catch";
}

此语句包含在我所有文件的全局包含文件中(为简单起见)。

因此,根据具体情况,我会生成一个 Facebook 登录 URL。预期的功能是用户登录 Facebook,授权应用程序,返回到登录 URL 中设置的重定向 URI,此时将执行 try 语句,并设置 $CI->our_fb['is_fb']。

然而,这并没有发生。

  • 如果用户已经登录 Facebook 并且该应用程序已获得授权,则它可以完美运行。成功

  • 如果用户没有登录到 Facebook,一旦重定向,变量就不会被设置。失败

  • 如果用户已登录,但在重定向后未授权应用程序,则未设置变量。失败。

在后两种情况下,如果您只是刷新页面,则设置变量 - SUCCESS。然而,刷新页面是不必要的/毫无意义的额外工作。

我的问题是,如果您需要登录 FB/或授权应用程序,例如您第一次使用 FB 登录时,您有额外的不必要的刷新,我不知道为什么。

我怀疑这与 cookie/会话有关?哪个保存了我认为不会同时自动返回/传递给 SDK 的访问令牌?

有人有什么想法吗?

4

3 回答 3

0

基本上,cookie 用于保存签名请求,会话用于保存“状态”、“代码”、“访问令牌”、“用户 ID”。如果存在上述情况,PHP SDK 会使用它们,无论它们是否有效。

我认为您的问题在于facebook发送的代码。特别是 base_facebook.php 中的这些行:

if ($code && $code != $this->getPersistentData('code')) {
  $access_token = $this->getAccessTokenFromCode($code);

...

protected function getAccessTokenFromCode($code, $redirect_uri = null) {
if (empty($code)) {
  return false;
}

if ($redirect_uri === null) {
  $redirect_uri = $this->getCurrentUrl();
}
...

由于 CODE 是针对特定 url 发布的,有时会出现这样的情况:访问者到达 www.example.com。他授予权限并被重定向到 example.com/login。但是代码在那里无效,因此 getUserAccessToken 返回 false。当您刷新页面时,您会得到相同的网址,一切都很好。

您处于不使用 getUser() 的正确轨道上,因为正如我在上面所写的,它是从会话中获取的(如果可用)。

于 2013-01-16T23:54:58.590 回答
0

我看到的方式是,如果用户未登录并且在页面初始加载后登录之前,您将尝试避免刷新。因此,您可以做的是向您网站上的另一个页面发出 ajax 请求,例如 id.php,它只加载 php sdk 并回显 $userid; 然后您可以在登录后获取用户 ID 而无需刷新。

于 2013-01-15T22:15:41.553 回答
0

如果您在 facebook(标签或画布)上有一个应用程序。PHP SDK 仅在初始加载页面时获取用户 ID,因为 asigned_request随请求一起发送到您的应用程序。

但是,当应用程序刷新时,signed_request 会丢失(因为发送它的是 facebook)。

因此,在这种情况下,您可以将 附加signed_request到您在应用程序中使用的每个 URL - 但这确实不是最佳的,因为signed_request不会重新生成 - 也不会刷新。

您唯一真正的选择是依靠 JS SDK 正确设置 cookie 并允许getUser按预期工作。这是必需的,因为您在 Facebook 中被视为第三方应用程序(在 iframe 中),并且大多数浏览器会阻止您设置 cookie - 因此您需要由 JS SDK 为您处理的工作。您可以搜索cross-domain cookiesthird-party cookie了解有关变通办法的说明,但这些变通办法只能通过 JS 脚本和 iframe 管理工作。

此外,请务必正确设置 JS SDK:通道文件允许 cookie和发送 P3P 标头(适用于 IE)。

您还可以检查这个相关问题:A proper approach to FB auth

关于 website,大多数情况下都是一样的(但你没有signed_request)。此时,请认真考虑使用 JS SDK,因为它更容易。或者,您可以确保您的应用程序流程遵循以下准则:https ://developers.facebook.com/docs/concepts/login/login-architecture/

于 2013-01-10T15:28:49.983 回答