利用Facebook登录应用的方法

1,在Facebook页面创建自己的应用


2,选择应用的类型


3,填写好app的名字与app的归类


4,配置及其他填写可以先暂时不填,返回应用页。如图。


5,在setting页面配置自己的app(localhost处需要填写自己服务器的地址)


6,这样Facebook页面的app配置就OK了。。从setting页面我们可以获取App ID和App Secret

APP ID:111xxxxx232*****12

App Secret:bbd4XXXXX15b04*****11c21b5b


7,Facebook进行登录

7-1:controller

<?php

class test extends MY_Controller{
    public function __construct() {
        parent::__construct();
        session_start();
    }
    //此处为Facebook登录授权页面
    public function facebook_login(){
        $config = $this->config->item('facebook');//此处为Facebook的app id和app secret,保存在配置文件中,你也可以保存到其他地方
	$this->load->library('fb_share_service', $config);
	$url = $this->fb_share_service->login_url(base_url().'fb_callback');
	$this->session->set_userdata('FBRLH_state', $_SESSION['FBRLH_state']);

	if (!empty($url)) {
		redirect($url);//此处在向Facebook发送请求,获取access token。
	}
    }
    
    //此处为Facebook回调函数页面
    public function facebook_callback(){
	$_SESSION['FBRLH_state'] = $this->session->userdata('FBRLH_state');
	$config = $this->config->item('facebook');
	$this->load->library('fb_share_service', $config);

	$facebook_user_info = $this->fb_share_service->login_callback(base_url() . 'fb_callback');
	if (!empty($facebook_user_info)) {
		$token['fb_token'] = $facebook_user_info['token'];
		$token['fb_id'] = $facebook_user_info['user_id'];
                
                log_message('debug', 'fb_token:'.$token['fb_token']);
                log_message('debug', 'fb_id:'.$token['fb_id']);
	} else {
		$handler_flg = FALSE;
	}
}
}
7-2:library

<?php 
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once(APPPATH.'third_party/facebook/FacebookSession.php');
require_once(APPPATH.'third_party/facebook/FacebookRequest.php');
require_once(APPPATH.'third_party/facebook/GraphUser.php');
require_once(APPPATH.'third_party/facebook/FacebookRequestException.php');
require_once(APPPATH.'third_party/facebook/FacebookRedirectLoginHelper.php');

class fb_share_service
{
    private $app_id;
    private $app_secret;

    public function fb_share_service($config)
    {
        $this->app_id = $config['appId'];
        $this->app_secret = $config['secret'];
        log_message('debug', 'Facebook_config_appId:'.$config['appId']);
        log_message('debug', 'Facebook_share_appId:'.$this->app_id);
        log_message('debug', 'Facebook_config_secret:'.$config['secret']);
        log_message('debug', 'Facebook_share_secret:'.$this->app_secret);
        FacebookSession::setDefaultApplication($this->app_id, $this->app_secret);
    }
    
    /**
    * create login url for facebook
    * @param string $callback_url 此处的callback url是在服务器自定义的回调函数
    */
   public function login_url($callback_url)
   {
           $helper = new FacebookRedirectLoginHelper($callback_url, $apiVersion = NULL);
           return $helper->getLoginUrl(array('publish_actions'));
   }
   
   /**
    * get access_token from callback
    * @param string $callback_url
    */
   public function login_callback($callback_url)
   {
           $helper = new FacebookRedirectLoginHelper($callback_url);
           try {
                   $session = $helper->getSessionFromRedirect();
                   if (!empty($session)) {
                           $token = $session->getToken();
                           if (!empty($token)) {
                                   $appsecret_proof= hash_hmac('sha256', $token, $this->app_secret);
                                   $request = new FacebookRequest(
                                           $session,
                                           'GET',
                                           '/me/permissions',
                                           array('appsecret_proof' => $appsecret_proof)
                                   );
                                   $response = $request->execute();
                                   $response_data = $response->getResponse()->data;
                                   
                                   if (is_array($response_data)) {
                                           foreach ($response_data as $key => $value) {
                                                   $permission = $value->permission;
                                                   if ('publish_actions' == $permission) {
                                                           $user_profile = (new FacebookRequest(
                                                                   $session,
                                                                   'GET',
                                                                   '/me',
                                                                   array('appsecret_proof' => $appsecret_proof)
                                                           ))->execute()->getGraphObject(GraphUser::className());
                                                           $res['user_id'] = $user_profile->getId();
                                                           $res['token'] = $token;
                                                           return $res;
                                                   }
                                           }
                                   }
                           }
                   }
                   return NULL;
           } catch(FacebookRequestException $ex) {
                   // When Facebook returns an error
                   log_message('debug', 'FacebookRequestException');
                   log_message('error', $ex->getMessage());
                   return NULL;
           } catch(\Exception $ex) {
                   log_message('debug', 'Exception');
                   log_message('error', $ex->getMessage());
                   // When validation fails or other local issues
                   return NULL;
           }
   }
}


这样在回调函数中我们就可以取到user_id和access_token了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值