使用 Facebook (PHP SDK) 和 Codeigniter 进行身份验证

2024-02-06

好吧,这几天我一直在尝试将 Facebook 身份验证集成到我基于 Codeigniter 的网站中。我已将 Facebook PHP SDK 作为一个库包含在内,并且似乎连接得很好,但是当我在 SDK 中使用 getUser 方法时,会返回 0,表明我尚未登录(除非我已登录到 facebook)。下面我以库的形式包含了 PHP SDK、调用 SDK 中方法的模型、从模型捕获数据的控制器以及向用户显示信息的视图。我希望你们能为我提供一些关于这个令人烦恼的问题的现场信息。提前感谢您的所有帮助! (以防万一你们想知道我正在使用我在上找到的教程中的一些代码http://www.dannyherran.com/2011/02/facebook-php-sdk-and-codeigniter-for-basic-user-authentication/ http://www.dannyherran.com/2011/02/facebook-php-sdk-and-codeigniter-for-basic-user-authentication/) :

FB PHP SDK 库(存储在应用程序/库中):

<?php //if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Copyright 2011 Facebook, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

require_once "base_facebook.php";

/**
 * Extends the BaseFacebook class with the intent of using
 * PHP sessions to store user ids and access tokens.
 */
class Facebook extends BaseFacebook
{
  /**
   * Identical to the parent constructor, except that
   * we start a PHP session to store the user ID and
   * access token if during the course of execution
   * we discover them.
   *
   * @param Array $config the application configuration.
   * @see BaseFacebook::__construct in facebook.php
   */
  public function __construct($config) {
    if (!session_id()) {
      session_start();
    }
    parent::__construct($config);
  }

  protected static $kSupportedKeys =
    array('state', 'code', 'access_token', 'user_id');

  /**
   * Provides the implementations of the inherited abstract
   * methods.  The implementation uses PHP sessions to maintain
   * a store for authorization codes, user ids, CSRF states, and
   * access tokens.
   */
  protected function setPersistentData($key, $value) {
    if (!in_array($key, self::$kSupportedKeys)) {
      self::errorLog('Unsupported key passed to setPersistentData.');
      return;
    }

    $session_var_name = $this->constructSessionVariableName($key);
    $_SESSION[$session_var_name] = $value;
  }

  protected function getPersistentData($key, $default = false) {
    if (!in_array($key, self::$kSupportedKeys)) {
      self::errorLog('Unsupported key passed to getPersistentData.');
      return $default;
    }

    $session_var_name = $this->constructSessionVariableName($key);
    return isset($_SESSION[$session_var_name]) ?
      $_SESSION[$session_var_name] : $default;
  }

  protected function clearPersistentData($key) {
    if (!in_array($key, self::$kSupportedKeys)) {
      self::errorLog('Unsupported key passed to clearPersistentData.');
      return;
    }

    $session_var_name = $this->constructSessionVariableName($key);
    unset($_SESSION[$session_var_name]);
  }

  protected function clearAllPersistentData() {
    foreach (self::$kSupportedKeys as $key) {
      $this->clearPersistentData($key);
    }
  }

  protected function constructSessionVariableName($key) {
    return implode('_', array('fb',
                              $this->getAppId(),
                              $key));
  }
}
?>

该模型:

<?php

/*
 * Copyright 2011 Facebook, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */


class Facebook_model extends CI_Model {

    public function __construct(){
        parent::__construct();

        $profile = null;
        // Create our Application instance (replace this with your appId and secret).
        $config = array(
                        'appId'  => 'MYAPPID',
                        'secret' => 'MYSECRET',
                        'fileUpload' => true, // Indicates if the CURL based @ syntax for file uploads is enabled.
                    );

        echo $this->load->library('Facebook', $config);

        // Get User ID
        $user = $this->facebook->getUser();

        // We may or may not have this data based on whether the user is logged in.
        //
        // If we have a $user id here, it means we know the user is logged into
        // Facebook, but we don't know if the access token is valid. An access
        // token is invalid if the user logged out of Facebook.

        $profile = null;
        if($user)
        {
            try {
                // Proceed knowing you have a logged in user who's authenticated.
                $profile = $this->facebook->api('/me?fields=id,name,link,email');
            } catch (FacebookApiException $e) {
                error_log($e);
                $user = null;
            }
        }


        $fb_data = array(
                        'me' => $profile,
                        'uid' => $user,
                        'loginUrl' => $this->facebook->getLoginUrl(
                            array(
                                'scope' => 'email,user_birthday,publish_stream', // app permissions
                                'redirect_uri' => '/profile' // URL where you want to redirect your users after a successful login
                            )
                        ),
                        'logoutUrl' => $this->facebook->getLogoutUrl(),
                    );

         $this->session->set_userdata('fb_data', $fb_data);

    }

}

?>

控制器:

<?php

    class The_facebook extends CI_Controller {

        public function __construct(){
            parent::__construct();
            $this->load->model('facebook_model');
        }

        public function index(){
            print_r($this->facebook);
            $fb_data = $this->session->userdata('fb_data'); // This array contains all the user FB information

            if((!$fb_data['uid']) or (!$fb_data['me']))
            {
                // If this is a protected section that needs user authentication
                // you can redirect the user somewhere else
                // or take any other action you need
                //redirect(base_url());
                echo "redirect";    

            }
            else
            {
                $data = array(
                        'fb_data' => $fb_data,
                      );

                $this->load->view('sand_view', $data);
            }

        }

    }

?>

最后是视图:

<body>
<div>
  <?php if(!$fb_data['me']): ?>
  Please login with your FB account: <a href="<?php echo $fb_data['loginUrl']; ?>">login</a>
  <!-- Or you can use XFBML -->
  <div class="fb-login-button" data-show-faces="false" data-width="100" data-max-rows="1" data-scope="email,user_birthday,publish_stream"></div>
  <?php else: ?>
  <img src="https://graph.facebook.com/<?php echo $fb_data['uid']; ?>/picture" alt="" class="pic" />
  <p>Hi <?php echo $fb_data['me']['name']; ?>,<br />
    <a href="<?php echo site_url('topsecret'); ?>">You can access the top secret page</a> or <a href="<?php echo $fb_data['logoutUrl']; ?>">logout</a> </p>
  <?php endif; ?>
</div>
</body>

我遇到了同样的问题,我的破解方法是将配置数组添加到 facebook 类的构造函数中,而不是将其作为参数传递给构造函数。由于某种原因,配置数组没有被传递或读取。

所以我的黑客看起来如下:

    public function __construct() {
    if (!session_id()) {
        session_start();
    }


    $config = array(
        'appId' => FACEBOOK_APP_ID,
        'secret' => FACEBOOK_SECRET
    );

    parent::__construct($config);
}

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Facebook (PHP SDK) 和 Codeigniter 进行身份验证 的相关文章

  • 增加内存限制时出现奇怪的错误

    我使用的是共享托管环境 PHP 的默认内存限制是 32M 我在 Concrete5 设置方面遇到一些问题 当我尝试登录 Concrete5 的管理面板时 出现内存限制错误Allowed memory size of 33554432 byt
  • 如何使用 php 从字符串中提取日期

    我需要从字符串中提取日期 下面是我的代码和字符串 str Updated status to Masters Software Engineering Enrolled Documents to Send on 03 06 2014 14
  • 如何在PHP中获取div中的所有链接

    我想从另一个网站打开一个页面 并提取一个中的所有链接 href div of class layout 2 2 在此页面中 我如何使用 PHP 来做到这一点 我想复制layout 2 2中的每个链接this https url 网页 这是我
  • FB.ui Facebook 分享不适用于帖子?

    当我发起行动时 FB ui method share this works fine href https www facebook com this works fine href https www facebook com 67850
  • Composer 无法下载文件

    我正在尝试在命令行上使用作曲家 php composer phar update php composer phar install php composer phar self update php composer phar selfu
  • CakePHP - 选择性 SSL

    如何对网站的某些部分强制使用 HTTPS 例如登录页面或注册页面 并使用 HTTP 来完成网站的其余部分 我最喜欢的强制转换为 https 的方法是将其作为 php 脚本中的第一件事 它可以在 Joomla 中运行 也可以在 CakePHP
  • 没有得到 popen 的完整回复

    嗨 我正在使用 popen 运行一个进程 handle popen python scriptos py r while feof handle data fgets handle echo gt data 我只从返回 5 行的进程中获取
  • php 检查文件是否存在于外部域中(从子域访问)

    我有一个网站http www reelfilmlocations co uk http www reelfilmlocations co uk 上述网站有一个管理区域 其中上传图像并在 uploads images 目录的子文件夹中创建不同
  • 我在 Facebook 上发现的这个奇怪的脚本是什么?

    这并不是一个帮助我自己编程的问题 但我在 Facebook 上发现了这个页面 其中有一个很酷的幻觉 并且一个页面上写着 要看到真正的幻觉 请将此代码复制并粘贴到您的地址栏中 并且有一个脚本 免责声明 请勿运行以下代码 javascript
  • 如何检查 $row['column_name'] 是否返回空 php mysql

    我有一个带有列的表格 id name phone describe 当我从这个表中获取值时 我正在使用 row mysql fetch array query 现在我想检查是否 row describe 返回空值 如何查看php 您可以使用
  • 从 PHP 生成渐变颜色

    我想知道如何构建一个给出颜色代码和 显示该颜色的渐变 例如 function generate color int colorindex Generate 10 pale colors of this color 请帮我 迈克尔引用的代码相
  • 管理面板的 htaccess 重写规则

    我的网络应用程序中有这样的 url 模式 www mysitename com foldername controller method 所有请求的页面首先被重定向到根文件夹上的index php 然后处理请求的页面 但每当我进入管理面板
  • ShareKit + Facebook 身份验证不起作用

    我正在使用 ShareKit 从我正在开发的 PhoneGap 应用程序发布到 Facebook 我在 Facebook 中创建了该应用程序 并在我的项目中安装了该插件 Twitter 工作正常 但当我尝试在 Facebook 上分享时出现
  • 退出 PHP 脚本后终止或停止 MySQL 查询

    我在工作中运行一个统计服务器 由于运行的查询量很大 该服务器有时会变得非常慢 我们的营销团队使用它作为主要统计工具 团队中的某些人有时会在脚本结束之前退出脚本 通过关闭浏览器或选项卡 同时 SQL 查询继续执行 当有人关闭或离开 PHP 脚
  • Oracle Blob 在 PHP 页面中作为 img src

    我有一个网站当前使用文件服务器上的图像 这些图像显示在页面上 用户可以根据需要拖放每个图像 这是使用 jQuery 完成的 图像包含在列表中 每张图片都非常标准 img src network path image png height 8
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • Laravel 意外错误“类用户包含 3 个抽象方法...”

    在 Laravel 上编写我的身份验证应用程序时 我遇到了一个以前从未见过的错误 我已经集思广益了近一个小时来解决这个问题的原因 但仍然找不到解决方案 Error User 类包含 3 个抽象方法 因此必须声明为抽象方法或实现其余方法 Il
  • Monolog,如何将 PHP 数组记录到控制台?

    我正在使用浏览器处理程序将消息记录到 JS 控制台 require once vendor autoload php use Monolog Logger use Monolog Handler BrowserConsoleHandler
  • 合并 csv 文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何在 PHP 或 joomla 中将多个 CSV 文件合并为一个 csv 文件 将文件夹中 csv 文件中的所有数据合并到文本文件中 通

随机推荐

  • 遵循视图模型模式的最佳实践

    我现在正在学习 ASP NET MVC 一段时间 我遵循在互联网或书籍中找到的一些指南 并且我想确保在我的开发中遵循有关视图模型模式的良好实践 下面是一个博客实现的简单示例 您能否确认我走的路是正确的 假设我想在视图上显示帖子标题 描述 并
  • 最大 MQTT 连接数

    我需要创建一个服务器场 可以处理 5 100 万个连接 5 00000 个主题 每个客户端一个 每秒处理 300k 消息 我尝试了解各种消息代理的功能 因此我目前使用两个 RHEL EC2 实例 r3 4xlarge 来获取大量可用资源 所
  • Highcharts.js 设置更改列颜色的阈值

    我想知道是否有人可以帮助我调整这个 Highcharts 线图 http jsfiddle net highcharts PMyHQ http jsfiddle net highcharts PMyHQ 到柱形图WHILE仍然保持阈值着色
  • 将多列表转换为两列表

    让我们假设我想分析格鲁吉亚 国家 不同地区 城市的旅游游客 这里很容易从以下网站获取数据 https www geostat ge en modules categories 101 domestic tourism https www g
  • 如何使用邮递员测试获得代码覆盖率

    我们在 RestEasy 中创建了 REST 服务 并在 Wildfly 服务器中运行 我们正在运行 Postman 测试用例来测试 Rest URL 当我们执行邮递员测试套件时 有没有办法获得服务的代码覆盖率 我们使用SonarQube来
  • 如何将数据追加到 Excel 工作表列中?

    我有包含一些数据的现有 Excel 文件 我想将数据附加到其中 在此输入图像描述 1 try xlApp new Excel Application xlWorkBook xlApp Workbooks Add misValue xlWor
  • 为什么我的 Google OAuth URL 在返回的 URL 中放置了哈希值?

    给定的网址 返回网址 如果返回 URL 完全有效 更改为 开始查询字符串 为什么谷歌要归还 因此 杀死查询字符串 单独说明 另外 我不太知道我是否应该提出要求token or code作为响应类型 我计划让用户将他们的 Google 云端硬
  • 为什么 selectOneMenu 将 ItemLabel 发送到转换器?

    我的 JSF 页面
  • 为什么我在尝试打印时收到 AttributeError

    我正在按照本教程学习 urllib2http docs python org howto urllib2 html urlerror http docs python org howto urllib2 html urlerror运行下面的
  • 使用 Swift Package Manager 时如何生成用于开发的 Xcode 项目文件

    我正在使用新的开源 Swift Package Manager 并且能够下载文件 我希望管理器根据它检索到的包创建一个 开发环境 通过 Xcode 有人处理过这个吗 更新 正如其他答案中提到的 您现在可以使用以下命令生成 Xcode 项目文
  • 获取 Chrome 扩展程序读取复制文本的权限

    我正在创建一个 Chrome 扩展程序 我希望能够看到用户从 Chrome 复制到剪贴板的内容 这是我目前在内容脚本中所做的工作 document addEventListener copy gt navigator clipboard r
  • 从 groupby 函数中选择组

    我的数据框 df1 group ordercode quantity 0 A 1 B 3 1 C 1 E 2 D 1 我通过以下方式组建了每个小组groupby功能 我需要使用组号提取数据 我想要的输出 在 获取组0 出去 ordercod
  • 将会员资格提供程序和 dbcontext 包装在单个事务上

    使用 EF 5 代码优先和 NET 4 5 的 MVC 项目 我一直在寻找一种将 dbContext 和 SimpleMembershipProvider 包装在单个事务上的方法 我尝试使用 TransactionScope 但由于会员资格
  • 将change、mouseup、mousedown、mouseout、keyup和keydown合并为一个函数

    我拥有的 我有一个文本框 它假定在相应的选择框中选择的任何选项的值 我对 on Change mouseup mousedown mouseout keyup 和 keydown 事件重复完全相同的函数 我需要的 是否可以将上述功能合并为一
  • Java - 动态更改日志记录级别

    我希望能够告诉 JVM 在执行链中的某个时刻停止记录特定级别的消息 在某些时候 我只想记录消息SEVERE水平 所以我正在考虑这样做 for Enumeration
  • 显示高度 100%:IE 中的表格单元格

    我希望在 div 下有一个带有 display table cell 的子元素 占据父 div 的整个高度 有谁知道为什么下面的代码片段在 Chrome 和 FF 中工作得很好 但在 IE 包括 10 下却崩溃了 HTML div clas
  • (数字)和(-数字)的含义

    是什么意思 number number 我已经搜索过但无法找到其含义 我想用i i 在 for 循环中 如 for i 0 i lt n i i i 假设 2 的补码 或者i未签名 i等于 i 1 i i 1 是提取最低设置位的技巧i 它之
  • qPython - kdb响应数据的类型转换

    当我使用 qPython 运行 q 查询时 我能够返回 pandas 数据框中的数据 我正在努力解决的是 字符串 列的类型 即在 q 中以简单或混合 字符 列表形式呈现的列 它们的数据类型是 object 值以 b ab34knadke 的
  • 发现蓝牙设备IOError:RPC服务器不可用

    我只是尝试在 PyCharm 中使用 Python 实现蓝牙PyBluez http karulis github io pybluez 我陷入了这个特殊的错误 我试图搜索这个错误 但找不到它 有人可以帮忙吗 这是我的代码 gt gt gt
  • 使用 Facebook (PHP SDK) 和 Codeigniter 进行身份验证

    好吧 这几天我一直在尝试将 Facebook 身份验证集成到我基于 Codeigniter 的网站中 我已将 Facebook PHP SDK 作为一个库包含在内 并且似乎连接得很好 但是当我在 SDK 中使用 getUser 方法时 会返