2011-10-15 107 views
2

我想整合我现有的PHP网站与Facebook登录功能。我目前有一个简单的登录注册用户名,密码和电子邮件进行激活,他们的详细信息存储在MYSQL数据库中。我想为Facebook用户添加额外的登录访问权限。我很担心我将如何将我当前的登录访问与新的Facebook访问进行整合。我的想法是我的所有页面都需要用户登录,我使用cookie来存储会话变量,比如我用来在网页上构建内容的昵称。Facebook集成在PHP网站

我很困惑我在网络上研究的许多方法,有些现在已经过时了,而其他的方法似乎是一半的解决方案。这三个不断重复出现。

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

(从Register.php片段)

<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登录页面片断)

$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访问与'正常'网络访问用户会话集成,因为它已关联会话vari用于用户体验的ables。

任何帮助将不胜感激,即时通讯挣扎。

感谢迈克尔

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

回答

0

,如果你谈论的是社会的插件,我不能说,但如果你是,这些Facebook Plug-ins拥有发电机建进入将生成你需要的代码的页面。

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

遵循简单脚本的路径应该让你到你需要的地方。

+0

感谢您的回答。我正在使用扩展插件进行社交插件。一个简单的登录按钮,注册和身份验证。我的网站已经这样做了,但我想通过Facebook身份验证添加Facebook新用户注册和常规用户访问。我在facebook dev网站或更广泛的网站上看到的任何内容都似乎给了我一个清晰的想法,即我需要在Facebook访问我现有的PHP文件时开始构建。 –

+0

https://developers.facebook.com/docs/reference/plugins/login/登录就在那里,认证将被这个插件自动使用。您可以使用i-frame进行注册,因为没有API来注册新用户。这iframe可以去注册所在的主页 – nmagerko

+0

谢谢你的建议,但我不认为你完全理解我的要求。让我解释。我希望之前从未使用过我的网络应用程序的Facebook用户能够注册我的MYSQL数据库,并获得'正常'用户的所有属性,包括'网站'会话而不是Facebook会话。所有新的OAuth 2.0插件登录/注册/身份验证都很容易设置,但很难集成到我现有的网站中,因为我想获取用户信息并将其保存到我的MYSQL用户数据库并为用户创建会话cookie变量所述用户信息。遗留的东西现在不工作。 –

3

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

  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. 在我的登录脚本,我设置的用户名,饼干等正常。

希望这有助于!

+0

它非常有帮助。你有一个非常好的解决方案,我刚刚有几个问题要问。 1)当你有一个新的fb用户,并且需要选择facebook路线时,在你给他们facebook注册并且他们被认证后,你如何将他们搭载到有效的会话上?是否通过将它们重新路由到具有凭据的预填充登录脚本? 2)你json_decode获得$ userid和$ email。你使用这些插入到你的数据库?我想在我的网络应用程序中使用fb名字lastname和用户名。 –

+0

1.是的,当我有一个新的FB用户,他们选择一个用户名后,我的代码基本上登录他们(本质上设置会话cookie),就好像他们自己点击了传统的登录按钮。因此,在您的注册脚本中,在您获得了新FB用户所需的所有信息后,只需重新路由到您的登录脚本即可传递其凭据。我使用我的脚本自行提交的隐藏表单来做到这一点。 2.是的,一旦我有了用户名和电子邮件,然后让他们选择一个用户名,我作为一个新用户插入到我的数据库。 –

+0

你介意分享你的完整脚本 - 注册和修改登录页面。 (显然不敏感)。我的电子邮件是[email protected]。我很感激。谢谢 –