Хорошо, поэтому в течение пары дней я пытаюсь интегрировать аутентификацию Facebook на свой сайт на основе Codeigniter. Я включил PHP PHP SDK в качестве библиотеки и, кажется, подключился очень хорошо, однако, когда я использую метод getUser в SDK, возвращается 0, указывающий, что я не зарегистрирован (кроме того, что я вошел в систему на facebook). Ниже я включил PHP SDK в библиотечную форму, модель, которая вызывает методы в SDK, контроллер, который захватывает данные из модели, и представление, отображающее информацию для пользователя. Я надеюсь, что yall может предложить мне некоторые из этих проблем. Спасибо за вашу помощь заранее! (и просто incase yall задаются вопросом, я использую какой-то код из учебника, который я нашел на http://www.dannyherran.com/2011/02/facebook-php-sdk-and-codeigniter-for-basic-user-authentication/ ):
Библиотека PHP FB PHP (хранится в приложении / библиотеках):
<?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); }
Надеюсь это поможет.
Я уже давно работаю с SDK на CodeIgniter и решил выпустить мой код как расширение с открытым исходным кодом. Есть одна вещь: этот код использует SDK в качестве библиотеки и построил над ним модель, имея множество других удивительных функций, готовых к использованию.
Если вы хотите использовать его или внести какой-либо вклад (проблемы, коммиты и т. Д.), Не стесняйтесь присоединяться:
Я закончил создание собственной интеграции, вы можете скачать ее здесь из GitHub: https://github.com/cworsley4/Codeigniter-with-Facebook