【问题标题】:Facebook Integration in a PHP sitePHP 网站中的 Facebook 集成
【发布时间】:2011-12-08 04:08:31
【问题描述】:

我正在尝试将我现有的 php 网站与 Facebook 登录功能集成。我目前有一个简单的登录注册用户名、密码和用于激活的电子邮件,它们的详细信息存储在 MYSQL 数据库中。我想为 Facebook 用户添加额外的登录权限。我担心如何将我当前的登录访问与新的 facebook 访问集成。我的主要想法是,我的所有页面都要求用户登录,并且我使用 cookie 来存储会话变量,例如我用来在页面上构建内容的昵称。

我对我在网络上研究的许多方法感到困惑,有些方法现在已经过时了,有些方法似乎只能解决一半。这三个不断重复发生。

A) Login.php、Register.php 和 fbReg.php login.php 和 register.php 在使用 fb login/register 登录以创建会话并将身份验证传递给 fbReg.php 时出现,但在页面重定向后它只是停在那里并出现空白屏幕。

(来自 Register.php 的 sn-p)

<script type="text/javascript">
FB.init({appId: '<?php echo $fb_app_id; ?>', status: true,
    cookie: true, xfbml: true});

<?php
    if ($errors == 0) {
    ?>
    $('#form_hidden').hide();
<?php } else { ?>
    checkInput('username');
    checkInput('email');
    checkInput('lastname');
    checkInput('firstname');
    checkInput('password');
    checkInput('password2');
<?php } ?>
</script>

B) 旧版连接身份验证 http://developers.facebook.com/docs/authentication/connect_auth/ 使用上面的链接,我构建了一些测试脚本只是为了查看身份验证是否有效。幸运的是,在我的网站上,我有第三方广告或网络框架,但按照信中的步骤构建 interstitial_page 并从我的主登录页面重定向页面。但是我不断收到一个空会话。

(来自php登录页面的sn-p)

$api_key = "YOUR_API_KEY";
$interstitial_page = "YOUR_SECURE_URL"; //URL with no 3rd party apps

$url='http://www.facebook.com/login.php?api_key=' . $api_key  
. '&session_version=3&next=' . urlencode($interstitial_page)
. '&v=1.0&return_session=1&fbconnect=1'
. '&cancel_url=' . urlencode($interstitial_page);

echo "Welcome to the Old Auth flow";
echo "<p>";

echo("<a href='" . $url . "'>"
. "<img src='http://static.ak.facebook.com/images/"
. "devsite/facebook_login.gif'></a>");

C) OAuth 2.0 协议 http://developers.facebook.com/docs/authentication/ 当我使用以下脚本再次使用它时:

 https://www.facebook.com/dialog/oauth?
 client_id=YOUR_APP_ID&redirect_uri=YOUR_URL

我尝试使用它来捕获我的新 facebook 站点用户的用户信息并将其存储到 MySQL 数据库,然后将此经过身份验证的 facebook 访问与“正常”Web 访问用户会话集成,因为它具有关联的会话变量,但未能成功。使用了用户体验。

任何帮助将不胜感激,我目前正在苦苦挣扎。

谢谢迈克尔

我在 fbReg.php 上得到一个空白屏幕

【问题讨论】:

    标签: authentication login oauth facebook legacy


    【解决方案1】:

    我上周刚刚为我的网站做了这件事,所以我知道要对所有许多方法进行分类是多么困难,其中许多方法已经过时了。这是我的方法:

    1. 我在我的网站上放置了“使用 Facebook 登录”链接,该链接重定向到我的正常注册页面。

      <a href="http://www.facebook.com/dialog/oauth?client_id=<? echo $FACEBOOK_APP_ID ?>&redirect_uri=http://www.yoursite.com/register.php&scope=email">Log in with Facebook</a>
      
    2. 我的注册脚本如下所示:

      <html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">
      <head></head>
      <body>
      <div id="fb-root"></div>
      <script src="http://connect.facebook.net/en_US/all.js"></script>
      <script>
      FB.init({appId: '<? echo $FACEBOOK_APP_ID ?>', status: true, cookie: true, xfbml: true});
      FB.Event.subscribe('auth.login', function(response) { window.location.reload(); });
      </script>
      
      function get_facebook_cookie($app_id, $app_secret) 
      {
          $args = array();
          parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
      
          ksort($args);
          $payload = '';
          foreach ($args as $key => $value) {
          if ($key != 'sig') {
          $payload .= $key . '=' . $value;
          }
          }
          if (md5($payload . $app_secret) != $args['sig']) {
          return null;
          }
          return $args;
      }
      
      $cookie = get_facebook_cookie($FACEBOOK_APP_ID, $FACEBOOK_SECRET);
      if($cookie)
      { 
          $access_token = $cookie['access_token'];
      
      }
      $url = 'https://graph.facebook.com/me?access_token='.$access_token;
      $graph = file_get_contents($url);
      if($graph) 
      {
      
          $fbuser = json_decode($graph);
          $userid = $fbuser->id;
          $email = mysql_real_escape_string($fbuser->email);
      
          /********************** 
          I placed code here to check if the  email already exists in my database, which means they are already a member. 
          In that case, I retrieve their username and password from the database and automatically log them 
          in by rerouting them to my login script with their crenditials sent as well.
          ***********************/
      
          /********************** 
          If the email is not already in my database, then I know it's a new user and so I prompt them to make a username here. 
          ***********************/
      }
      //The user either opted to log in using my traditional non-Facebook method, or something went wrong with the FB authentication
      else 
      {
      
          /********************** 
          Show my normal registration form that prompts for username, email, etc 
          ***********************/
      }
      
    3. 在我的登录脚本中,我像往常一样设置了用户名等 cookie。

    希望这会有所帮助!

    【讨论】:

    • 帮助很大。你有一个非常好的解决方案,我有几个问题要问。 1)当您有一个新的并且需要选择facebook路线的fb用户时,在您为他们提供facebook注册并对其进行身份验证后,您如何将他们搭载到有效会话中?是通过将它们重新路由到带有凭据的预填充登录脚本吗? 2)你json_decode得到$userid和$email。你用这些来插入你的数据库吗?我想在我的网络应用中使用 fb firstname lastname 和 username。
    • 1.是的,当我有一个新的 FB 用户时,在他们选择用户名后,我的代码基本上会为他们登录(本质上是设置会话 cookie),就好像他们自己点击了传统的登录按钮一样。因此,在您的注册脚本中,获得新 FB 用户所需的所有信息后,只需重新路由到您的登录脚本,并传递他们的凭据。我使用我的脚本自行提交的隐藏表单来执行此操作。 2. 是的,一旦我有了用户 ID 和电子邮件,然后让他们选择用户名,我就将它们作为新用户插入到我的数据库中。
    • 您介意分享您的完整脚本 - 注册和修改后的登录页面。 (明显脱敏)。我的电子邮件是 michael.mkpadi@michuksltd.com。我很感激。谢谢
    • 我在使用注册脚本时遇到了这个错误,就像你在上面提到的那样。警告:file_get_contents(graph.facebook.com/me?access_token=) [function.file-get-contents]:打开流失败:连接被拒绝
    • 更新:我用 curl 替换了 file_get_contents。错误处理更好。但是,当我单击主站点上的“使用 Facebook 登录”链接到我的注册 php 时,FB.init 脚本似乎不起作用,因为我无法获得 FB auth 登录验证,并且有条件将我重定向到我的非 Facebook登录,即使我现在有一个活跃的 fb 会话。任何帮助将不胜感激。
    【解决方案2】:

    我不知道您是否在谈论社交插件,但如果您是,这些Facebook Plug-ins 在页面中内置了生成器,可以生成您需要的代码。

    如果您不是在寻找插件而是为用户寻找信息,我仍然建议您运行生成器以获取代码,并查看 Facebook 如何为用户获取信息。

    按照简单脚本的路径,您应该可以到达您需要的位置。

    【讨论】:

    • 感谢您的回答。我追求带有扩展的社交插件。一个简单的登录按钮,注册和身份验证。我的网站已经这样做了,但我想通过 Facebook 身份验证添加 Facebook 新用户注册和常规用户访问。我在 facebook 开发网站或更广泛的网络上看到的任何内容似乎都没有让我清楚地了解我需要在 Facebook 中开始构建对我现有 php 文件的访问权限。
    • developers.facebook.com/docs/reference/plugins/login 登录在那里,并且此插件将自动使用身份验证。您可以使用 i-frame 进行注册,因为没有 API 来注册新用户。此 iframe 可以转到注册所在的主页
    • 感谢您的建议,但我认为您没有完全理解我的要求。让我解释。我希望以前从未使用过我的网络应用程序的 Facebook 用户能够在我的 MYSQL 数据库上注册并获得“普通”用户的所有属性,包括“网站”会话而不是 Facebook 会话。所有新的 OAuth 2.0 插件登录/注册/身份验证都非常容易设置,但很难集成到我现有的网站中,因为我想获取用户信息并将其保存到我的 MYSQL 用户数据库并为用户创建会话 cookie 变量说用户信息。旧的东西现在不工作了。
    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2023-04-09
    相关资源
    最近更新 更多