Skip to content

Instantly share code, notes, and snippets.

@jessedobbelaere
Created November 5, 2012 19:08
Show Gist options
  • Save jessedobbelaere/4019651 to your computer and use it in GitHub Desktop.
Save jessedobbelaere/4019651 to your computer and use it in GitHub Desktop.
Twitter oAuth problem
# Twitter configuration
fos_twitter:
file: %kernel.root_dir%/../vendor/kertz/twitteroauth/twitteroauth/twitteroauth.php
consumer_key: herewasmyconsumerkey
consumer_secret: herewasmyconsumersecret
callback_url: http://matchtracker.localhost/app_dev.php/login_twitter_check
jms_security_extra:
secure_all_services: false
expressions: true
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
chain_provider:
chain:
providers: [fos_userbundle, my_fos_twitter_provider]
fos_userbundle:
id: fos_user.user_provider.username_email
my_fos_facebook_provider:
id: my.facebook.user
my_fos_twitter_provider:
id: my.twitter.user
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: /.*
form_login:
check_path: /login_check
login_path: /login
provider: fos_userbundle
logout:
path: /logout
target: /
handlers: ["fos_facebook.logout_handler"]
fos_facebook:
app_url: "http://apps.facebook.com/matchtracker/"
server_url: "http://matchtracker.localhost/"
login_path: /login
check_path: /login_facebook_check
default_target_path: /
provider: my_fos_facebook_provider
fos_twitter:
login_path: /twitter/login
check_path: /twitter/login_check
default_target_path: /
provider: my_fos_twitter_provider
security: true
anonymous: ~
#http_basic:
# realm: "Secured Demo Area"
access_control:
- { path: /dashboard/.*, role: ROLE_ADMIN }
#- { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
parameters:
# match_tracker_app.example.class: MatchTracker\AppBundle\Example
services:
my.facebook.user:
class: MatchTracker\AppBundle\Security\User\Provider\FacebookProvider
arguments:
facebook: "@fos_facebook.api"
userManager: "@fos_user.user_manager"
validator: "@validator"
container: "@service_container"
my.twitter.user:
class: MatchTracker\AppBundle\Security\User\Provider\TwitterProvider
arguments:
twitter_oauth: "@fos_twitter.api"
userManager: "@fos_user.user_manager"
validator: "@validator"
session: "@session"
<?php
/*
* This file is part of the FOSTwitterBundle package.
*
* (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace FOS\TwitterBundle\Services;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use TwitterOAuth;
class Twitter
{
private $twitter;
private $session;
private $router;
private $callbackRoute;
private $callbackURL;
public function __construct(TwitterOAuth $twitter, Session $session, $callbackURL = null)
{
$this->twitter = $twitter;
$this->session = $session;
$this->callbackURL = $callbackURL;
}
public function setCallbackRoute(RouterInterface $router, $routeName)
{
$this->router = $router;
$this->callbackRoute = $routeName;
}
public function getLoginUrl()
{
/* Get temporary credentials. */
$requestToken = ($callbackUrl = $this->getCallbackUrl()) ?
$this->twitter->getRequestToken($callbackUrl)
: $this->twitter->getRequestToken();
/* Save temporary credentials to session. */
$this->session->set('oauth_token', $requestToken['oauth_token']);
$this->session->set('oauth_token_secret', $requestToken['oauth_token_secret']);
/* If last connection failed don't display authorization link. */
switch ($this->twitter->http_code) {
case 200:
/* Build authorize URL and redirect user to Twitter. */
$redirectURL = $this->twitter->getAuthorizeURL($requestToken);
return $redirectURL;
break;
default:
/* return null if something went wrong. */
return null;
}
}
public function getAccessToken($oauthToken, $oauthVerifier)
{
//set OAuth token in the API
$this->twitter->setOAuthToken($oauthToken, $this->session->get('oauth_token_secret'));
/* Check if the oauth_token is old */
if ($this->session->has('oauth_token')) {
if ($this->session->get('oauth_token') && ($this->session->get('oauth_token') !== $oauthToken)) {
$this->session->remove('oauth_token');
return null;
}
}
/* Request access tokens from twitter */
$accessToken = $this->twitter->getAccessToken($oauthVerifier);
/* Save the access tokens. Normally these would be saved in a database for future use. */
$this->session->set('access_token', $accessToken['oauth_token']);
$this->session->set('access_token_secret', $accessToken['oauth_token_secret']);
/* Remove no longer needed request tokens */
!$this->session->has('oauth_token') ?: $this->session->remove('oauth_token', null);
!$this->session->has('oauth_token_secret') ?: $this->session->remove('oauth_token_secret', null);
/* If HTTP response is 200 continue otherwise send to connect page to retry */
if (200 == $this->twitter->http_code) {
/* The user has been verified and the access tokens can be saved for future use */
return $accessToken;
}
/* Return null for failure */
return null;
}
private function getCallbackUrl()
{
if (!empty($this->callbackURL)) {
return $this->callbackURL;
}
if (!empty($this->callbackRoute)) {
return $this->router->generate($this->callbackRoute, array(), true);
}
return null;
}
}
<?php
namespace MatchTracker\AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
class TwitterController extends Controller {
public function connectTwitterAction()
{
$request = $this->get('request');
$twitter = $this->get('fos_twitter.service');
$authURL = $twitter->getLoginUrl($request);
$response = new RedirectResponse($authURL);
return $response;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment