代码之家  ›  专栏  ›  技术社区  ›  somejkuser

在zend 1框架应用程序的不同位置使用getUser方法提供的facebook SDK ID不正确

  •  2
  • somejkuser  · 技术社区  · 10 年前

    在我们的系统中,我很难使用facebook用户ID。通过facebookapi方法检索信息后 getUser() ,我无法从任何后续调用中获取该id 获取用户() .

    以下是将用户重定向到facebook登录的注册代码:

        $this->view->layout ()->disableLayout ();
        $this->_helper->viewRenderer->setNoRender ( true );
        $appId = Ranger_Application_Util::getConfig('facebook_app_id');
        $appSecret = Ranger_Application_Util::getConfig('facebook_app_secret');
        require_once 'facebook/src/facebook.php';
        $facebook = new Facebook(array(
                'appId' => $appId,
                'secret' => $appSecret,
                'cookie' => true
        ));
        $args = array();
        $args['redirect_uri'] = 'http://url.com/en/account/callback-facebook';
        $url = $facebook->getLoginUrl($args);
        $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper ( 'Redirector' );
        $redirector->gotoUrl ( $url )->redirectAndExit ();
    

    以下是重定向代码:

        $this->view->layout ()->disableLayout ();
        $this->_helper->viewRenderer->setNoRender ( true );
        $appId = Ranger_Application_Util::getConfig('facebook_app_id');
        $appSecret = Ranger_Application_Util::getConfig('facebook_app_secret');
        require_once 'facebook/src/facebook.php';
        $facebook = new Facebook(array(
                'appId' => $appId,
                'secret' => $appSecret,
                'cookie' => true
        ));     
        $accessToken = $facebook->getAccessToken();     
        $mdl = new Core_Model_Resource_Users();
        $user = $facebook->getUser();       
        if($user){
            try {
                $profile = $facebook->api('/me');               
                $newUserId = $mdl->insert(array(
                        'fuid' => $user,
                        'facebook_access_token' => $accessToken,
                        'first_name' => $profile['first_name'],
                        'middle_name' => $profile['middle_name'],
                        'last_name' => $profile['last_name'],
                        'status' => 'active',
                        'verified' => 1,
                        'hash' => Ranger_Application_Util::generateHash(),
                        'acl_role' => 'client',
                        'avatar' => 'default.png',
                        'date_created' => new Zend_Db_Expr("NOW()"),
                        'date_updated' => new Zend_Db_Expr("NOW()"),
                        'username' => 'user'.Ranger_Application_Util::generateHash()
                ));
            } catch(Exception $e){
                echo "Issue getting user information. ".$e->getMessage();
                die();
            }
        } else {
            echo "Issue getting user information";
            die();
        }
    

    现在是我的 zend插件 那个 检测facebook是否使用自动登录 。这只应在回调后激活。

        public function preDispatch(Zend_Controller_Request_Abstract $request) {
            $appId = Ranger_Application_Util::getConfig('facebook_app_id');
            $appSecret = Ranger_Application_Util::getConfig('facebook_app_secret');
            require_once 'facebook/src/facebook.php';
            $facebook = new Facebook(array(
                   'appId' => $appId,
                   'secret' => $appSecret,
                   'cookie' => true
            ));
            $user = $facebook->getUser();
            if($user){
                $fetchMode = Core::db()->getFetchMode();
                Core::db()->setFetchMode(Zend_Db::FETCH_OBJ);
                $userProfile = $facebook->api('/me');
                $mdl = new Core_Model_Resource_Users();
                $sel = $mdl->select();
                $sel->where('fuid=:fuid')->bind(array(":fuid"=>$user));
    (OR:)       $sel->where('fuid=:fuid')->bind(array(":fuid"=>$userProfile['id']));
                $data = $mdl->fetchRow($sel);
                Core::db()->setFetchMode($fetchMode);
                Ranger_Application_Util::logUserIn($data->id);
          }
    

    无论我做了多少次以下操作:

    • 清除饼干和历史
    • 使用 $facebook->destroySession() 方法

    以下是MySQL信息:

    FUID -> INT(30)
    FACEBOOK_ACCESS_TOKEN -> VARCHAR(255)
    

    它仍然向我提供两个不同的ID $user 检测代码部分 此外,似乎只有在使用检测代码时,ID才不相等。

    你知道我该做什么吗?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Barkermn01    10 年前

    您不应该使用两种不同的方法来获取用户id,而Graph API是推荐的方法。 $p = $facebook->api("/me"); $p['id']

    重定向代码:

    $this->view->layout ()->disableLayout ();
        $this->_helper->viewRenderer->setNoRender ( true );
        $appId = Ranger_Application_Util::getConfig('facebook_app_id');
        $appSecret = Ranger_Application_Util::getConfig('facebook_app_secret');
        require_once 'facebook/src/facebook.php';
        $facebook = new Facebook(array(
                'appId' => $appId,
                'secret' => $appSecret,
                'cookie' => true
        ));     
        $accessToken = $facebook->getAccessToken();     
        $mdl = new Core_Model_Resource_Users();
        $user = $facebook->getUser();       
        if($user){
            try {
                $profile = $facebook->api('/me');               
                $newUserId = $mdl->insert(array(
                        'fuid' => $profile["id"],
                        'facebook_access_token' => $accessToken,
                        'first_name' => $profile['first_name'],
                        'middle_name' => $profile['middle_name'],
                        'last_name' => $profile['last_name'],
                        'status' => 'active',
                        'verified' => 1,
                        'hash' => Ranger_Application_Util::generateHash(),
                        'acl_role' => 'client',
                        'avatar' => 'default.png',
                        'date_created' => new Zend_Db_Expr("NOW()"),
                        'date_updated' => new Zend_Db_Expr("NOW()"),
                        'username' => 'user'.Ranger_Application_Util::generateHash()
                ));
            } catch(Exception $e){
                echo "Issue getting user information. ".$e->getMessage();
                die();
            }
        } else {
            echo "Issue getting user information";
            die();
        }
    

    再次确保 fuid 列设置为字符串类型MySQL varchar(200) 是我用于facebook的UID

    public function preDispatch(Zend_Controller_Request_Abstract $request) {
            $appId = Ranger_Application_Util::getConfig('facebook_app_id');
            $appSecret = Ranger_Application_Util::getConfig('facebook_app_secret');
            require_once 'facebook/src/facebook.php';
            $facebook = new Facebook(array(
                   'appId' => $appId,
                   'secret' => $appSecret,
                   'cookie' => true
            ));
            $user = $facebook->getUser();
            if($user){
                $fetchMode = Core::db()->getFetchMode();
                Core::db()->setFetchMode(Zend_Db::FETCH_OBJ);
                $userProfile = $facebook->api('/me');
                $mdl = new Core_Model_Resource_Users();
                $sel = $mdl->select();
                $sel->where('fuid='.$userProfile['id']);
                // i don't like bind for one variable php will be quicker  using string concatenation
                $data = $mdl->fetchRow($sel);
                Core::db()->setFetchMode($fetchMode);
                Ranger_Application_Util::logUserIn($data->id);
          }
    

    这就是你应该做的