CakePHP + Facebook - PullRequest
       11

CakePHP + Facebook

1 голос
/ 04 марта 2011

Я пытаюсь внедрить Facebook Подключиться к моему приложению CakePHP. я использую плагин Ника в Facebook.

Я хочу реализовать это таким образом

  1. Когда пользователь заходит на сайт, он должен иметь возможность войти через регистрацию на сайте или через Facebook Connect
  2. Существующие пользователи должны иметь возможность подключить свою учетную запись к своей учетной записи FB
  3. Люди, которые впервые заходят на сайт с помощью FB Connect и не имеют учетной записи на сайте. следует перенаправить на страницу, где они должны ввести данные для заполнения профиля.

Что я сделал - Я следовал инструкциям Ника, чтобы реализовать его, и когда я нажимаю на кнопку «Вход», он подключается к моему приложению. но я не понимаю, как создать имя пользователя и пароль, связанные с идентификатором Fb Connect. и использовать его против токена FB.

Ответы [ 2 ]

5 голосов
/ 04 марта 2011

Видимо, я делаю то же самое вещь немного раньше вас ...; -)

Вот метод входа в Facebook, который я использую (слегка отредактирован и аннотирован):

public function facebook($authorize = null) {
    App::import('Lib', 'Facebook.FB');
    $Fb = new FB();

    $session = $Fb->getSession();

    // not logged into Facebook and not a callback either,
    // sending user over to Facebook to log in
    if (!$session && !$authorize) {
        $params = array(
            'req_perms'  => /* the permissions you require */,
            'next'       => Router::url(array('action' => 'facebook', 'authorize'), true),
            'cancel_url' => Router::url(array('action' => 'login'), true)
        );
        $this->redirect($Fb->getLoginUrl($params));
    }

    // user is coming back from Facebook login,
    // assume we have a valid Facebook session
    $userInfo = $Fb->api('/me');

    if (!$userInfo) {
        // nope, login failed or something went wrong, aborting
        $this->Session->setFlash('Facebook login failed');
        $this->redirect(array('action' => 'login'));
    }

    $user = array(
        'User' => array(
            'firstname'       => $userInfo['first_name'],
            'lastname'        => $userInfo['last_name'],
            'username'        => trim(parse_url($userInfo['link'], PHP_URL_PATH), '/'),
            'email'           => $userInfo['email'],
            'email_validated' => $userInfo['verified']
        ),
        'Oauth' => array(
            'provider'        => 'facebook',
            'provider_uid'    => $userInfo['id']
        )
    );

    $this->oauthLogin($user);
}

Это дает мне массив со всеми пользовательскими данными, которые я мог бы получить из Facebook, и вызывает ::oauthLogin, который либо регистрирует пользователя с указанной информацией, либо запрашивает пользователязаполнить недостающие данные и / или создать новую запись пользователя в базе данных.Самая важная часть, которую вы получаете от API Facebook - это $userInfo['id'] и / или адрес электронной почты, которые вы можете использовать для идентификации пользователя в вашей базе данных.Если вы используете AuthComponent, вы можете «вручную» войти в систему пользователя, используя $this->Auth->login($user_id), где $user_id - это идентификатор пользователя в вашей собственной базе данных.


private function oauthLogin($data) {
    $this->User->create();

    // do we already know about these credentials?
    $oauth = $this->User->Oauth->find('first', array('conditions' => $data['Oauth']));

    if ($oauth) {
        // yes we do, let's try to log this user in
        if (empty($oauth['User']['id']) || !$this->Auth->login($oauth['User']['id'])) {
            $this->Session->setFlash('Login failed');
        }
        $this->redirect('/');
    }

    // no we don't, let's see if we know this email address already
    if (!empty($data['User']['email'])) {
        $user = $this->User->find('first', array('conditions' => array('email' => $data['User']['email'])));
        if ($user) {
            // yes we do! let's store all data in the session
            // and ask the user to associate his accounts

            $data['User'] = array_merge($data['User'], $user['User']);
            $data['Oauth']['user_id'] = $user['User']['id'];

            $this->Session->write('Oauth.associate_accounts', $data);
            $this->redirect(array('action' => 'oauth_associate_accounts'));
        }
    }

    // no, this is a new user, let's ask him to register        
    $this->Session->write('Oauth.register', $data);
    $this->redirect(array('action' => 'oauth_register'));
}
0 голосов
/ 04 марта 2011

Смотрите не дальше.Вот отличная статья, которая проведет вас по всему пути (за исключением любых готовых плагинов):
Интеграция Facebook Connect с компонентом аутентификации CakePHP

Простоследуйте подходу, описанному там.

Приветствия, м ^ е

...