Facebook graph api 如何将FacebookSDK登录与cakephp 2.x集成?

Facebook graph api 如何将FacebookSDK登录与cakephp 2.x集成?,facebook-graph-api,cakephp,cakephp-2.0,integration,facebook-php-sdk,Facebook Graph Api,Cakephp,Cakephp 2.0,Integration,Facebook Php Sdk,关于Facebook登录与cakephp Auth组件在线集成的最新资源似乎很少,甚至没有。我找到了以下资源: 使用CakePHP1.3的旧版本?以及Facebook SDK的旧版本 这似乎正在发展中 除此之外,我没有找到确定的资源。我希望集成尽可能灵活(不使用魔术插件)。因此,经过大量研究,我终于想出了一个像样的解决方案,我今天在这里分享。请贡献我的力量,因为我是cake的新手。将Cakephp 2.x Auth与Facebook Auth集成,实现无缝用户身份验证 首先,您应该阅读奇妙的ca

关于Facebook登录与cakephp Auth组件在线集成的最新资源似乎很少,甚至没有。我找到了以下资源:

  • 使用CakePHP1.3的旧版本?以及Facebook SDK的旧版本
  • 这似乎正在发展中

  • 除此之外,我没有找到确定的资源。我希望集成尽可能灵活(不使用魔术插件)。因此,经过大量研究,我终于想出了一个像样的解决方案,我今天在这里分享。请贡献我的力量,因为我是cake的新手。

    将Cakephp 2.x Auth与Facebook Auth集成,实现无缝用户身份验证

    首先,您应该阅读奇妙的cakePHP,并遵循cakePHP书籍2.x中的说明(假设您也遵循了本系列的前两个教程)。完成后,您应该能够构建一个具有用户身份验证和授权的简单cakePHP应用程序

    接下来,您应该下载并从facebook获得


    首先,我们将Facebook sdk复制到App/Vendors中。然后,我们将在AppController方法中导入并初始化它

    //app/Controller/AppController.php
    
    public function beforeFilter() {
        App::import('Vendor', 'facebook-php-sdk-master/src/facebook');
        $this->Facebook = new Facebook(array(
            'appId'     =>  'App_ID_of_facebook',
            'secret'    =>  'App_Secret'
    
        ));
    
        $this->Auth->allow('index', 'view');
    }
    
    我们正在AppController中初始化Facebook SDK,以便通过应用程序访问它。接下来,我们将使用SDK生成Facebook登录URL,并将其传递给视图。我通常在方法中执行此操作

    注意:以上配置详细信息(appId和secret)最好保存在App/Config/facebook.php中。然后您应该使用

    我们将更新布局,以便为所有未登录的用户显示此facebook登录链接。请注意,我们如何将
    redirect_uri
    设置为我们的应用程序用户/登录操作。这样,一旦facebook验证了一个用户,我们也可以使用cake::Auth登录他。这有多种好处

    我们完成了!正如您所看到的,大部分繁重的工作都是通过这个操作完成的。您最好将上面的一些代码移到UserModel中。下面是所发生的事情的摘要

    首先,我们检查登录请求是否是从我们的应用程序@Users/login的登录表单发送的。如果是,那么我们只需让用户登录。否则,我们检查用户是否存在于我们的数据库中,以及他是否登录或创建新用户,然后让他登录

    请注意,在此处验证用户时,不要使用他们的电子邮件,例如他们的facebook_id。否则,用户可能会更改他们的facebook电子邮件,并劫持您应用程序的其他用户


    愉快的编码!

    嗨,Shafee,我已经跟随了你的例子,但是出于某种原因,我收到了这条消息10次中的1次。“OAutheException:必须使用活动访问令牌来查询有关当前用户的信息”你对此有什么解决方案吗?似乎是一种有效的方法(尚未测试).那么,你能将其标记为已接受的答案吗,因为这就是你最终使用的答案?谢谢,这对我帮助很大,我唯一想实现的是有一个登录的弹出窗口,而不是重定向到新的url:添加
    “display”=>“popup”,
    到getLoginUrl似乎不起作用。谢谢我无法使用您的解决方案获取电子邮件自从我发布此消息后,Facebook SDK发生了更改。您应该阅读文档中的更改内容
    //app/Controller/AppController.php
    
    public function beforeRender() {
        $this->set('fb_login_url', $this->Facebook->getLoginUrl(array('redirect_uri' => Router::url(array('controller' => 'users', 'action' => 'login'), true))));
        $this->set('user', $this->Auth->user());
    }
    
    <!-- App/Views/Layouts/default.ctp just after <div id="content"> -->
    <?php
        if($user) echo 'Welcome ' . $user['username'];
        else {
            echo $this->Html->link('Facebook Login', $fb_login_url) . ' | ';
            echo $this->Html->link('Logout', array('controller' => 'user', 'action' => 'logout'));
    ?>
    
    // App/Controller/UsersController.php
    // Handles login attempts from both facebook SDK and local
    public function login()
    {
        // If it is a post request we can assume this is a local login request
        if ($this->request->isPost()){
            if ($this->Auth->login()){
                $this->redirect($this->Auth->redirectUrl());
            } else {
                $this->Session->setFlash(__('Invalid Username or password. Try again.'));
            }
        } 
    
        // When facebook login is used, facebook always returns $_GET['code'].
        elseif($this->request->query('code')){
    
            // User login successful
            $fb_user = $this->Facebook->getUser();          # Returns facebook user_id
            if ($fb_user){
                $fb_user = $this->Facebook->api('/me');     # Returns user information
    
                // We will varify if a local user exists first
                $local_user = $this->User->find('first', array(
                    'conditions' => array('username' => $fb_user['email'])
                ));
    
                // If exists, we will log them in
                if ($local_user){
                    $this->Auth->login($local_user['User']);            # Manual Login
                    $this->redirect($this->Auth->redirectUrl());
                } 
    
                // Otherwise we ll add a new user (Registration)
                else {
                    $data['User'] = array(
                        'username'      => $fb_user['email'],                               # Normally Unique
                        'password'      => AuthComponent::password(uniqid(md5(mt_rand()))), # Set random password
                        'role'          => 'author'
                    );
    
                    // You should change this part to include data validation
                    $this->User->save($data, array('validate' => false));
    
                    // After registration we will redirect them back here so they will be logged in
                    $this->redirect(Router::url('/users/login?code=true', true));
                }
            }
    
            else{
                // User login failed..
            }
        }
    }