Твиттер OAuth + авто логин + MYSQL - PullRequest
1 голос
/ 10 июля 2011

Я использую библиотеку https://github.com/abraham/twitteroauth. Я уже создал свое приложение в Twitter, обратные вызовы работают нормально (даже на localhost), но меня беспокоит одна вещь: КАК происходит автоматический вход в систему? Я знаю, что есть «user_id», который хранится в базе данных MYSQL вместе с oauth_token и oauth_token_secret, но как мне получить user_id, как только пользователь заходит на сайт, поэтому я могу запросить базу данных, чтобы узнать, существует ли она уже и что , без необходимости всплывающего окна авторизации в твиттере, затем снова и снова достигая обратного вызова?

Я видел много вопросов, подобных этому, но никто никогда не отвечал на них удовлетворительным образом.

Ответы [ 2 ]

0 голосов
/ 27 июля 2011

на самом деле, это должно быть сочетание PHP $_SESSION с обратными вызовами OAuth. После обратного вызова установите текущий идентификатор пользователя, который вы вставили в базу данных, или запросите «user_id» из ответа Twitter OAuth (который вы также должны сохранить в базе данных вместе с именем пользователя), затем используйте его для использования в будущем и используйте $_SESSION содержит данные зарегистрированных пользователей в вашей собственной базе данных.

Итак, для быстрого примера

function action_login()
{
    if ( ! $this->user->is_logged())
    {
        // Create TwitterOAuth object with our Twitter provided keys
        $tOAuth = new TwitterOAuth($this->config->get('consumer_key'), $this->config->get('consumer_secret'));
        // Generate request tokens
        $requestToken = $tOAuth->getRequestToken(url::site('auth/twitter','http'));
        $_SESSION["oauth_token"] = $requestToken["oauth_token"];
        $_SESSION["oauth_token_secret"] = $requestToken["oauth_token_secret"];
        // Display Twitter log in button with encoded link
        $this->view->set('url', $tOAuth->getAuthorizeURL($requestToken["oauth_token"]));
        $_SESSION['current_url'] = Request::detect_uri();
    }

    echo $this->view->render();
}

public function action_twitter()
{
    if ( empty($_GET["denied"]) && isset($_GET["oauth_token"])) 
    {
        if ($_GET["oauth_token"] == @$_SESSION["oauth_token"]) 
        {
            // Use generated request tokens (from session) to construct object
            $tOAuth = new TwitterOAuth($this->config->get('consumer_key'), $this->config->get('consumer_secret'), $_SESSION["oauth_token"], $_SESSION["oauth_token_secret"]);
            // Retrieve access token from Twitter
            $accessToken = $tOAuth->getAccessToken();
            // Check we have valid response
            if(is_numeric($accessToken["user_id"]))  {
                // Remove request token session variables
                if ($this->user->loaded() || $this->user->where('user_id', '=', $accessToken['user_id'])->find()->loaded())
                {
                    $this->user->values(array(
                        'oauth_token' => $accessToken['oauth_token'],
                        'oauth_token_secret' => $accessToken['oauth_token_secret'],
                        'screen_name' => $accessToken['screen_name'],
                    ))->update();
                }
                else
                {
                    $this->user->values(array(
                        'user_id' => $accessToken['user_id'],
                        'oauth_token' => $accessToken['oauth_token'],
                        'oauth_token_secret' => $accessToken['oauth_token_secret'],
                        'screen_name' => $accessToken['screen_name'],
                    ))->create();
                }

                unset($_SESSION["oauth_token"]);
                unset($_SESSION["oauth_token_secret"]);
                echo $this->view->render();
                // Redirect to main page
            } 
        }
    }

    $this->request->redirect($_SESSION['current_url']);
}

так что, по сути, АВТОМАТИЧЕСКИЙ ВХОД (например, пользователь уже зарегистрирован в твиттере и уже зарегистрирован на вашем сайте) не может быть выполнен без его нажатия кнопки «ВХОД С TWITTER», если вы не установите время жизни вашего $_SESSION довольно высоко (как, например, с twitpic).

$this->user->is_logged() проверяет $_SESSION['id'] (автоинкремент на MYSQL) и $_SESSION['twitter']['user_id'] из твиттера info

РЕДАКТИРОВАТЬ: Кроме того, самый быстрый и чистый способ сделать это, сделать вызов AJAX на странице загрузки с учетными данными Twitter с использованием Javascript SDK, а затем установить переменные $_SESSION с информацией, предоставленной SDK.

0 голосов
/ 10 июля 2011

Те, которые следует сохранить для автоматической проверки пользователя, это oauth_access_token и oauth_access_secrete Вам удалось получить их из твиттера? Ооут стео являются:

Получение токена запроса Отправка пользователя на авторизацию Обмен токена запроса на токен доступа Использование режима out-of-band / PIN-кода для настольных и мобильных приложений

пожалуйста, обратитесь к: http://dev.twitter.com/pages/auth

...