friendsofsymfony / twitter-bundle
Requires
- php: >=5.3.2
- kertz/twitteroauth: *
- symfony/framework-bundle: 2.*
- symfony/security-bundle: 2.0.*
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标签。
安装
-
将此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兼容
-
将命名空间
FOS
注册到您项目的自动加载引导脚本中//app/autoload.php $loader->registerNamespaces(array( // ... 'FOS' => __DIR__.'/../vendor/bundles', // ... ));
-
将此Bundle添加到应用程序的kernel中
//app/AppKernel.php public function registerBundles() { return array( // ... new FOS\TwitterBundle\FOSTwitterBundle(), // ... ); }
-
在您的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
-
添加以下配置以使用安全组件
#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: ~