/**
  * Processes the callback from OAuth provider
  * 
  * @param sfRequest $request 
  */
 public function executeCallback(sfRequest $request)
 {
     $this->forward404Unless($request->getParameter('provider'));
     // user has denied auth'ing the app, don't continue
     if ($request->hasParameter('error')) {
         $this->redirect('@homepage');
     }
     $config = sfConfig::get('app_cacophony');
     $provider = $request->getParameter('provider');
     $this->forward404Unless(in_array($provider, array_keys($config['providers'])));
     // if OAuth 2.0
     if (is_null($config['providers'][$provider]['request_token_url'])) {
         $this->forward($request->getParameter('module'), 'callback2');
     }
     if (!$this->getUser()->isAuthenticated() || $config['plugin']['allow_multiple_tokens']) {
         $requestToken = $this->getUser()->getAttribute('requestToken', null, sprintf('sfCacophonyPlugin/%s', $provider));
         if ($requestToken) {
             try {
                 $this->getUser()->setAttribute('accessToken', sfCacophonyOAuth::getAccessToken($provider, $request->getParameter('oauth_token'), $requestToken['oauth_token_secret'], $request->getParameter('oauth_verifier')), sprintf('sfCacophonyPlugin/%s', $provider));
                 $this->getUser()->getAttributeHolder()->remove('requestToken', null, sprintf('sfCacophonyPlugin/%s', $provider));
                 // add me to session
                 $me = sfCacophonyOAuth::getMe($provider, $this->getUser()->getAttribute('accessToken', null, sprintf('sfCacophonyPlugin/%s', $provider)));
                 $this->getUser()->setAttribute('me', $me['normalized'], sprintf('sfCacophonyPlugin/%s', $provider));
             } catch (Exception $e) {
                 $this->getUser()->setFlash('error', sprintf('Failed to retrieve access token: %s', $e->getMessage()));
                 $this->redirect('@homepage');
             }
         }
     } else {
         $this->redirect('@homepage');
     }
     return sfView::NONE;
 }