Не могу получить email из Vkontakte при аутентификации через него

Yan

Новичок
Добрый день! Уже весь день мучаюсь, самому не удалось решить проблему. Делаю аутентификацию через соц сети, в частности, через Vk, но не могу получить email, указал scope, передал в fields, которые надо получить, как пользователь кликнул "Разрешить" использовать эти данные, но все равно пишет Notice: Undefined index: email in ...
Подскажите в чем проблема. Спасибо!

Страница с самой аутентификацией:
Код:
    $client_id='555555555'; // ID приложения
    $client_secret='qwqwqwqwqwqwqwwqwqwqw'; // Ключ приложения
    $redirect_uri='http://localhost/user/site'; // Адрес сайта

    $url='http://oauth.vk.com/authorize';

    $params=array(
        'client_id'=>$client_id,
        'redirect_uri'=>$redirect_uri,
        'response_type'=>'code',
        'scope'=>'email'
    );
    echo $link='<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация ВКонтакте</a></p>';
Страница с обработчиком, куда делает редирект:
Код:
if (isset($_GET['code'])) {
    $result = false;
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );

    $token=json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);

    if (isset($token['access_token'])) {
        $params=array(
            'uids'=>$token['user_id'],
            'fields'=>'uid,first_name,last_name,email',
            'access_token'=>$token['access_token']
        );

        $userInfo = json_decode(file_get_contents('https://api.vk.com/method/users.get' . '?' . urldecode(http_build_query($params))), true);
        if (isset($userInfo['response'][0]['uid'])) {
            $userInfo = $userInfo['response'][0];
            $result = true;
        }
    }

    if ($result) {
        echo "Имя: " . $userInfo['first_name'] . '<br />';
        echo "Фамилия: " . $userInfo['last_name'] . '<br />';
        echo "Имейл: " . $userInfo['email'] . '<br />';
    }
}
Решение (email лежит в токене):
if (isset($userInfo['response'][0]['uid'])) {
$userInfo['response'][0]['email'] = $token['email'];
$userInfo = $userInfo['response'][0];
$result = true;
}

echo "Имейл пользователя: " . $userInfo['email'] . '<br />';
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
А ты смотрел, он вообще есть в $userInfo?
 

Yan

Новичок
Спасибо, я читал эту документацию, но, видимо, не до конца.
Получается, что не смогу получить email?
Подскажите, тогда авторизация через Vk вообще не имеет смысла? Мне тогда нечего проверять на уникальность, имя и фамилия могут совпадать.
 

Yan

Новичок
Все, я понял! Мне и не нужен email, буду использовать его ID.

Подскажите, пожалуйста, как правильно делается:
1. Создать две таблицы для пользователей. Одна для тех, кто аутентифицировался через социальные сети, а вторая для тех, кто зарегистрировался через обычную форму.
2. Создать одну таблицу для всех. Если пользователь регистрируется через обычную форму, то давать ему левый неповторяемый ID и проверять уникальность по email. Если пользователь входит через соц сеть, то записывать для него левый email и проверять уникальность по ID.

Первый способ вроде логичнее, но какая практика в этом случае? Спасибо за совет!
 

hell0w0rd

Продвинутый новичок
Можно email. Только он приходит вроде с токеном. По users.get нельзя
 
  • Like
Реакции: Yan

Andkorol

Новичок
В цитате достаточно внятно описаны условия, при соблюдении которых сервер вместе с токеном вернет email пользователя.
Эти условия в данном случае выполняются?
В $token нет элемента email?
 
Последнее редактирование:
  • Like
Реакции: Yan

Yan

Новичок
В цитате достаточно внятно описаны условия, при соблюдении которых сервер вместе с токеном вернет email пользователя.
Эти условия в данном случае выполняются?
В $token нет элемента email?
Супер, спасибо! Достал email, впервые имел дело с токеном, надо мне еще подробнее в этом разобраться.
 

hell0w0rd

Продвинутый новичок
Только учти, что у пользователя есть возможность отказаться предоставлять email, но остальное разрешить.
 

Yan

Новичок
Только учти, что у пользователя есть возможность отказаться предоставлять email, но остальное разрешить.
Спасибо, действительно об этом не подумал. Тогда может и правда использовать ID пользователя, который зашел через соц сеть, а не email, и создавать 2 таблицы пользователей?
 

hell0w0rd

Продвинутый новичок
Зачем 2 таблицы? Ты на каждую соц-сеть по таблице сделаешь?:)
Сделай несколько полей, vk_id, facebook_id, twitter_id и тд. Таким образом можно и привязку сделать, чтобы пользователь через разные соц-сети мог заходить.
 

Yan

Новичок
Зачем 2 таблицы? Ты на каждую соц-сеть по таблице сделаешь?:)
Сделай несколько полей, vk_id, facebook_id, twitter_id и тд. Таким образом можно и привязку сделать, чтобы пользователь через разные соц-сети мог заходить.
Ну да, глупо. И тогда в этих полях хранить его ID из соответствующей соц сети, а в поля для других соц сетей вставлять произвольные значения? И если он регистрируется по обычному, то все эти поля заполнять произвольными значениями?
 

Yan

Новичок
Adelf, а как принято на практике?
Появилась идея сделать только одно поле и в зависимости от того, как авторизируется пользователь, писать туда ID какой-то соц сети, либо email. И еще сделать рядом поле для указания соц сети или обычной авторизации.
 

Adelf

Administrator
Команда форума
@Yan, эта идея мне ближе. два поля - тип авторизации и id этой авторизации. правда для обычной еще пароль нужен.
А еще народ делает несколько возможных авторизаций. Поэтому правильнее основная таблица с юзерами(туда же можно email и пароль - их часто генерят даже если юзер не регился обычным способом). И дополнительная с возможными авторизациями для этого юзера. user_id, auth_type, auth_id. Как-нибудь так.
 

Yan

Новичок
@Yan, эта идея мне ближе. два поля - тип авторизации и id этой авторизации. правда для обычной еще пароль нужен.
А еще народ делает несколько возможных авторизаций. Поэтому правильнее основная таблица с юзерами(туда же можно email и пароль - их часто генерят даже если юзер не регился обычным способом). И дополнительная с возможными авторизациями для этого юзера. user_id, auth_type, auth_id. Как-нибудь так.
Ок, спасибо за совет, буду реализовывать:)
 
Сверху