Symfony2: Авторизация через соц. сети VKontakte, Facebook, Odnoklassniki. OAuth 2.0

1 мин на чтение

Update: Рассмотрите в первую очередь https://github.com/hwi/HWIOAuthBundle

Собственно, так получилось, что я сделал авторизацию через 3 популярные соцсети на OAuth 2.0. Тестировалось все под symfony 2.1:

AbstractSocialBundle

VKontakte

Facebook

Odnoklassniki

К сожалению, полной документации по интеграции бандлов у меня пока нет, опишу кратко.

Как поставить

./composer.phar require ailove-dev/vk-bundle dev-master
./composer.phar require ailove-dev/ok-bundle dev-master
./composer.phar require ailove-dev/facebook-bundle dev-master

Необходимо в security.yml интегрировать провайдер для нужной соц. сети (если у вас несколько авторизаций будет, то обычно делают chain provider):

    providers:

        chain_provider:

            chain:

                providers: [  fos_userbundle, vk_provider, fb_provider, ok_provider]

        fos_userbundle:

            id: fos_user.user_provider.username_email

        vk_provider:

            id: vk.user.provider

        ok_provider:

            id: ok.user.provider

        fb_provider:

            id: fb.user.provider

Также необходимо описать файрволы:

    firewalls:

         main:

            pattern: ^/

            fb_firewall:

                check_path: /fb/login_check/

                login_path: /fb/login/

                use_forward: false

                failure_path: /fail

                always_use_default_target_path: true

                default_target_path: /user/connect/

                provider: chain_provider

            vk_firewall:

                check_path: /vk/login_check/

                login_path: /vk/login/

                use_forward: false

                failure_path: /

                always_use_default_target_path: true

                default_target_path: /user/connect/

                provider: chain_provider

            ok_firewall:

                check_path: /ok/login_check/

                login_path: /ok/login/

                use_forward: false

                failure_path: /

                always_use_default_target_path: true

                default_target_path: /user/connect/

                provider: chain_provider

            anonymous: true

            logout:

                path: /logout

                target: /
/user/connect/ здесь - роут для контроллера, который будет обрабатывать авторизовавшегося пользователя (бандлы только создают соответствующий токен). Пример контроллера можно посмотреть здесь.

Доступ к контроллеру стоит ограничить только для авторизованных пользователь (бандлы используют соответствующие роли, поэтому их стоит добавить в ROLES):

    role_hierarchy:

        # Social

        ROLE_VK_USER: [ROLE_USER]

        ROLE_OK_USER: [ROLE_USER]

        ROLE_FACEBOOK_USER: [ROLE_USER]

        ROLE_REGISTERED: [ROLE_VK_USER, ROLE_OK_USER, ROLE_FACEBOOK_USER]

        # Admin

        ROLE_ADMIN:       ROLE_REGISTERED

        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH, ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT, ROLE_SONATA_PAGE_ADMIN_BLOCK_EDIT, ROLE_REGISTERED]

Cсылки для входа и выхода:

<a href="{{ path('_vk_login') }}">VK</a> | <a href="{{ path('_ok_login') }}">OK</a> | <a href="{{ path('_fb_login') }}">FB</a>
<a href="{{ path('fos_user_security_logout') }}">Выход</a>
Также бандлы поддаются настройке! Посмотреть параметры можно здесь.

 

Разделы:

Дата изменения: