friendsofsymfony/twitter-bundle

此包已被弃用且不再维护。作者建议使用 hwi/oauth-bundle 包。

Symfony FOSTwitterBundle

1.0.0 2011-12-13 06:41 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:20:13 UTC


README

请参阅 HWIOAuthBundle

简介

此Bundle可以实现与Twitter PHP的集成。此外,它还提供了一个Symfony2认证提供者,以便用户可以通过Twitter登录到Symfony2应用程序。此外,通过自定义用户提供者支持,Twitter登录还可以与其他数据源集成,如由FOSUserBundle提供的基于数据库的解决方案。

如果您正在使用Symfony 2.0,请切换到TwitterBundle的v1.0分支或使用1.0.0标签。

Build Status

安装

  1. 将此Bundle和Abraham Williams的Twitter库作为Git子模块添加到您的项目中

     $ git submodule add git://github.com/FriendsOfSymfony/FOSTwitterBundle.git vendor/bundles/FOS/TwitterBundle
     $ git submodule add git://github.com/kertz/twitteroauth.git vendor/twitteroauth
    

注意: kertz/twitteroauth已修复以与FOSTwitterBundle兼容

  1. 将命名空间FOS注册到您项目的自动加载引导脚本中

     //app/autoload.php
     $loader->registerNamespaces(array(
           // ...
           'FOS'    => __DIR__.'/../vendor/bundles',
           // ...
     ));
    
  2. 将此Bundle添加到应用程序的kernel中

     //app/AppKernel.php
     public function registerBundles()
     {
         return array(
             // ...
             new FOS\TwitterBundle\FOSTwitterBundle(),
             // ...
         );
     }
    
  3. 在您的YAML配置中配置twitter服务

       #app/config/config.yml
       fos_twitter:
           file: %kernel.root_dir%/../vendor/twitteroauth/twitteroauth/twitteroauth.php
           consumer_key: xxxxxx
           consumer_secret: xxxxxx
           callback_url: http://www.example.com/login_check
    
  4. 添加以下配置以使用安全组件

       #app/config/security.yml
       security:
           providers:
               fos_twitter:
                   id: fos_twitter.auth
           firewalls:
               secured:
                   pattern:   /secured/.*
                   fos_twitter: true
               public:
                   pattern:   /.*
                   anonymous: true
                   fos_twitter: true
                   logout: true
           access_control:
               - { path: /.*, role: [IS_AUTHENTICATED_ANONYMOUSLY] }
    

使用Twitter @Anywhere

注意:如果您想使安全组件与Twitter @Anywhere一起工作,您需要在客户端身份验证成功后向配置的检查路径发送请求(有关示例配置,请参阅https://gist.github.com/1021384)。

包含了一个用于使用Twitter @Anywhere的模板辅助器。要使用它,首先在DOM顶部调用->setup()方法。

    <!-- inside a php template -->
      <?php echo $view['twitter_anywhere']->setup() ?>
    </head>

    <!-- inside a twig template -->
      {{ twitter_anywhere_setup() }}
    </head>

完成此操作后,您可以将JavaScript排队在库实际加载时运行。

    <!-- inside a php template -->
    <span id="twitter_connect"></span>
    <?php $view['twitter_anywhere']->setConfig('callbackURL', 'http://www.example.com/login_check') ?>
    <?php $view['twitter_anywhere']->queue('T("#twitter_connect").connectButton()') ?>

    <!-- inside a twig template -->
    <span id="twitter_connect"></span>
    {{ twitter_anywhere_setConfig('callbackURL', 'http://www.example.com/login_check') }}
    {{ twitter_anywhere_queue('T("#twitter_connect").connectButton()') }}

最后,在DOM底部调用->initialize()方法。

    <!-- inside a php template -->
      <?php $view['twitter_anywhere']->initialize() ?>
    </body>

    <!-- inside a twig template -->
    {{ twitter_anywhere_initialize() }}
    </body>

配置Twitter @Anywhere

您可以使用模板辅助器的setConfig()方法设置配置。

使用FOSUserBundle的示例自定义用户提供者

要使用此提供者,您需要在config.yml中添加一个新的服务。

# app/config/config.yml
services:
        my.twitter.user:
            class: Acme\YourBundle\Security\User\Provider\TwitterUserProvider
            arguments:
                twitter_oauth: "@fos_twitter.api"
                userManager: "@fos_user.user_manager"
                validator: "@validator"
                session: "@session" 

您还需要在您的用户模型类中添加一些新的属性和方法。

<?php
// src/Acme/YourBundle/Entity/User.php

        /** 
         * @var string
         */
        protected $twitterID;

        /** 
         * @var string
         */
        protected $twitter_username;


        /**
         * Set twitterID
         *
         * @param string $twitterID
         */
        public function setTwitterID($twitterID)
        {
            $this->twitterID = $twitterID;
            $this->setUsername($twitterID);
            $this->salt = '';
        }

        /**
         * Get twitterID
         *
         * @return string 
         */
        public function getTwitterID()
        {
            return $this->twitterID;
        }

        /**
         * Set twitter_username
         *
         * @param string $twitterUsername
         */
        public function setTwitterUsername($twitterUsername)
        {
            $this->twitter_username = $twitterUsername;
        }

        /**
         * Get twitter_username
         *
         * @return string 
         */
        public function getTwitterUsername()
        {
            return $this->twitter_username;
        }

这是TwitterUserProvider类

<?php
// src/Acme/YourBundle/Security/User/Provider/TwitterUserProvider.php


namespace Acme\YourBundle\Security\User\Provider;

use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\HttpFoundation\Session;
use \TwitterOAuth;
use FOS\UserBundle\Entity\UserManager;
use Symfony\Component\Validator\Validator;

class TwitterUserProvider implements UserProviderInterface
{
    /** 
     * @var \Twitter
     */
    protected $twitter_oauth;
    protected $userManager;
    protected $validator;
    protected $session;

    public function __construct(TwitterOAuth $twitter_oauth, UserManager $userManager,Validator $validator, Session $session)
    {   
        $this->twitter_oauth = $twitter_oauth;
        $this->userManager = $userManager;
        $this->validator = $validator;
        $this->session = $session;
    }   

    public function supportsClass($class)
    {   
        return $this->userManager->supportsClass($class);
    }   

    public function findUserByTwitterId($twitterID)
    {   
        return $this->userManager->findUserBy(array('twitterID' => $twitterID));
    }   

    public function loadUserByUsername($username)
    {
        $user = $this->findUserByTwitterId($username);

        $this->twitter_oauth->setOAuthToken($this->session->get('access_token'), $this->session->get('access_token_secret'));

        try {
            $info = $this->twitter_oauth->get('account/verify_credentials');
        } catch (Exception $e) {
            $info = null;
        }

        if (!empty($info)) {
            if (empty($user)) {
                $user = $this->userManager->createUser();
                $user->setEnabled(true);
                $user->setPassword('');
                $user->setAlgorithm('');
            }

            $username = $info->screen_name;

            $user->setTwitterID($info->id);
            $user->setTwitterUsername($username);
            $user->setEmail('');
            $user->setFirstname($info->name);

            $this->userManager->updateUser($user);
        }

        if (empty($user)) {
            throw new UsernameNotFoundException('The user is not authenticated on twitter');
        }

        return $user;
    }

    public function refreshUser(UserInterface $user)
    {
        if (!$this->supportsClass(get_class($user)) || !$user->getTwitterID()) {
            throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
        }

        return $this->loadUserByUsername($user->getTwitterID());
    }
}

最后,要从Twitter获取认证令牌,您需要在控制器中创建一个像这样的操作。

<?php
// src/Acme/YourBundle/Controller/DefaultController.php

        /** 
        * @Route("/connectTwitter", name="connect_twitter")
        *
        */
        public function connectTwitterAction()
        {   

          $request = $this->get('request');
          $twitter = $this->get('fos_twitter.service');

          $authURL = $twitter->getLoginUrl($request);

          $response = new RedirectResponse($authURL);

          return $response;

        }  

您可以在您的Twig模板中创建一个按钮,将用户发送到Twitter进行身份验证。

         <a href="{{ path ('connect_twitter')}}"> <img src="/images/twitterLoginButton.png"></a> 

  • 注意:您在config.yml中的回调URL必须指向您的配置的check_path
# app/config/config.yml

        fos_twitter:
            ...
            callback_url: http://www.yoursite.com/twitter/login_check

请记住编辑您的security.yml以使用此提供者

# app/config/security.yml

        security:
            encoders:
                Symfony\Component\Security\Core\User\User: plaintext

            role_hierarchy:
                ROLE_ADMIN:       ROLE_USER
                ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

            providers:

                my_fos_twitter_provider:
                    id: my.twitter.user 

            firewalls:
                dev:
                    pattern:  ^/(_(profiler|wdt)|css|images|js)/
                    security: false

                public:
                    pattern:  /
                    fos_twitter:
                        login_path: /twitter/login
                        check_path: /twitter/login_check
                        default_target_path: /
                        provider: my_fos_twitter_provider

                    anonymous: ~