Задать вопрос

Расширение Yii2 EAuth. Как исправить ссылку на авторизацию вК с соцкнопки?

День добрый!

Заинтересовался авторизацией через соцсети в Yii2, набрел на этот проект: nodge.ru/yii-eauth/demo2 По этой ссылке в нём прекрасно логинится через вКонтакт)

Скачал его к себе на комп из репозитория https://github.com/Nodge/yii2-eauth-demo/ и начал экспериментировать на локальном сервере XAMPP. Намучавшись с конфигурированием Апача (сделал virtual host для адреса вида yii2vk.com) и некоторыми другими проблемами, упёрся в то что с локалхоста не авторизует с кнопки VK со страницы логина из-за того, что ссылки авторизации имеют извращенный вид типа yii2vk.com/login?service=vkontakte - в то время как на исходном демо-сайте они имели нормальный вид типа nodge.ru/yii-eauth/demo2/login/vkontakte

И вообще ссылки со всех соцкнопок на локалхосте имеют вид login?service=...

При этом если напрямую вбить в адресной строке yii2vk.com/login/vkontakte - то всё прекрасно авторизуется, даже несмотря на то что локалхост))) т.е. сама связь с вКонтактом работает. Не работают именно кнопки виджета расширения EAuth из-за странных ссылок из них.

С ЧПУ в общем и целом вроде бы нормально всё, иначе бы yii2vk.com/login выдавало бы 404-ю (как оно в самом начале и выдавало, пока я не сконфигурировал Апач корректно, чтобы не надо было вбивать index.php?r=site/login). А сами prettyUrl в приложении были включены еще авторами, выложившими на Гитхаб. В правилах urlManager прописано 'login/' => 'site/login' как советуют в инструкции к расширению.

В чём может быть дело? Почему на демо-сайте ссылки с соцкнопок со страницы логина правильные, а у меня криво всё?
  • Вопрос задан
  • 1827 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
В своем проекте я сделал так:
1. Запилил свой клаас "OAuth2_VKontakteService.php"
2. Отнаследовал его от "nodge\eauth\services\VKontakteOAuth2Service"
3. Переопределил в нем параметры и методы.

<?php
namespace frontend\models;

use common\models\User;
use nodge\eauth\services\VKontakteOAuth2Service;

/**
 * VKontakte provider class.
 *
 * @package application.extensions.eauth.services
 */
class OAuth2_VKontakteService extends VKontakteOAuth2Service
{

    const SCOPE_FRIENDS = 'friends';
    const SCOPE_EMAIL = 'email';

    protected $name = 'vkontakte';
    protected $title = 'VK.com';
    protected $type = 'OAuth2';
    protected $jsArguments = array('popup' => array('width' => 500, 'height' => 450));

    protected $scopes = [self::SCOPE_EMAIL];
    protected $providerOptions = [
        'authorize' => 'http://api.vk.com/oauth/authorize',
        'access_token' => 'https://api.vk.com/oauth/access_token'
    ];
    protected $baseApiUrl = 'https://api.vk.com/method/';

    protected function fetchAttributes()
    {
        $tokenData = $this->getAccessTokenData();
        $info = $this->makeSignedRequest('users.get.json', array(
            'query' => array(
                'uids' => $tokenData['params']['user_id'],
                'fields' => 'email, sex, bdate, photo_big'
            )
        ));

        $info = $info['response'][0];

        $this->attributes['service'] = $this->getServiceName();

        $this->attributes['id'] = $info['uid'];
        $this->attributes['url'] = 'http://vk.com/id' . $info['uid'];
        $this->attributes['name'] = $info['first_name'] . ' ' . $info['last_name'];
        $this->attributes['firstname'] = $info['first_name'];
        $this->attributes['lastname'] = $info['last_name'];
        $this->attributes['gender'] = ($info['sex'] === 2) ? User::SEX_MALE : User::SEX_FEMALE;;
        $b = explode('.', $info['bdate']);
        $this->attributes['birthday'] = $b[2] . '-' . $b[1] .'-' . $b[0];
        $this->attributes['photo'] = $info['photo_big'];
        $this->attributes['email'] = $tokenData['params']['email'];

        $this->attributes['info'] = $info;

        return true;
    }
}


P.S.: Тоже самое я сделал для twitter, facebook, odnoklasniki и др. Для чего я это делал? А для того, чтобы все используемые OAuth сервисы возвращали полученные данные в одном формате, ибо после авторизации они передаются в модель и валидируются.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы