public function callback($req, $res)
 {
     if ($req->query('error_reason')) {
         return $res->redirect('/');
     }
     // generate forceLogin redirect_uri
     if ($req->query('forceLogin')) {
         $this->app['config']->set('instagram.redirect_uri', $this->app['config']->get('instagram.redirect_uri') . '?forceLogin=t');
     }
     $instagram = $this->app['instagram'];
     /* authenticate the user with the instagram API */
     $authenticatedUser = false;
     try {
         if ($instagram->Users->Authorize($req->query('code'))) {
             $authenticatedUser = $instagram->Users->getCurrentUser();
         }
     } catch (\Exception $e) {
         $this->app['logger']->error($e);
     }
     if (!$authenticatedUser) {
         $this->app['errors']->push(['context' => 'user.login', 'error' => 'invalid_token', 'message' => 'Instagram: Login error. Please try again.']);
         $usersController = new \app\users\Controller($this->app);
         return $usersController->loginForm($req, $res);
     }
     /* fetch the user's full profile */
     try {
         $user_profile = $instagram->Users->Info($authenticatedUser['id'])->data;
     } catch (\Exception $e) {
         $this->app['logger']->error($e);
         return $res->setCode(500);
     }
     /* log the user in or kick off signup */
     $currentUser = $this->app['user'];
     $iid = $user_profile['id'];
     // generate parameters to update profile
     $profileUpdateArray = ['id' => $iid, 'access_token' => $instagram->getAccessToken()];
     // instagram id matches existing user?
     $user = User::findOne(['where' => ['instagram_id' => $iid]]);
     if ($user) {
         // check if we are dealing with a temporary user
         if (!$user->isTemporary()) {
             if ($user->id() != $currentUser->id()) {
                 if ($req->query('forceLogin') || !$currentUser->isLoggedIn()) {
                     // log the user in
                     $this->app['auth']->signInUser($user->id(), 'instagram');
                 } else {
                     // inform the user that the instagram account they are trying to
                     // connect belongs to someone else
                     return new View('switchingAccounts/instagram.tpl', ['title' => 'Switch accounts?', 'otherUser' => $user, 'otherProfile' => $user->instagramProfile()]);
                 }
             }
             $profile = new InstagramProfile($iid);
             // create or update the profile
             if ($profile->exists()) {
                 $profile->set($profileUpdateArray);
             } else {
                 $profile = new InstagramProfile();
                 $profile->create($profileUpdateArray);
             }
             // refresh profile from API
             $profile->refreshProfile($user_profile);
             return $this->finalRedirect($req, $res);
         } else {
             // show finish signup screen
             $req->setSession('iid', $iid);
             return $res->redirect('/signup/finish');
         }
     }
     if ($currentUser->isLoggedIn()) {
         // add to current user's account
         $currentUser->set('instagram_id', $iid);
     } else {
         // save this for later
         $req->setSession('iid', $iid);
     }
     $profile = new InstagramProfile($iid);
     // create or update the profile
     if ($profile->exists()) {
         $profile->set($profileUpdateArray);
     } else {
         // create profile
         $profile = new InstagramProfile();
         $profile->create($profileUpdateArray);
     }
     // refresh profile from API
     $profile->refreshProfile($user_profile);
     // get outta here
     if ($currentUser->isLoggedIn()) {
         $this->finalRedirect($req, $res);
     } else {
         $res->redirect('/signup/finish');
     }
 }
 public function callback($req, $res)
 {
     if ($req->query('denied')) {
         return $res->redirect('/');
     }
     $twitter = $this->twitter($req->session('oauth_token'), $req->session('oauth_token_secret'));
     $token_credentials = $twitter->getAccessToken($req->query('oauth_verifier'));
     if (!isset($token_credentials['oauth_token'])) {
         $this->app['errors']->push(['context' => 'user.login', 'error' => 'invalid_token', 'message' => 'Twitter: Invalid token. Please try again.']);
         $usersController = new \app\users\Controller();
         $usersController->injectApp($this->app);
         return $usersController->loginForm($req, $res);
     }
     $twitter = $this->twitter($token_credentials['oauth_token'], $token_credentials['oauth_token_secret'], false);
     // fetch profile
     $user_profile = $twitter->get('account/verify_credentials');
     if (isset($user_profile->errors)) {
         return $res->setBody('There was an error signing you into Twitter:<br/><pre>' . print_r($user_profile->errors, true) . '</pre>');
     }
     /* log the user in or kick off signup */
     $currentUser = $this->app['user'];
     $tid = $user_profile->id;
     // generate parameters to update profile
     $user_profile = (array) json_decode(json_encode($user_profile), true);
     $profileUpdateArray = ['id' => $tid, 'access_token' => $token_credentials['oauth_token'], 'access_token_secret' => $token_credentials['oauth_token_secret']];
     // twitter id matches existing user?
     $users = User::find(['where' => ['twitter_id' => $tid]]);
     if ($users['count'] == 1) {
         $user = $users['models'][0];
         // check if we are dealing with a temporary user
         if (!$user->isTemporary()) {
             if ($user->id() != $currentUser->id()) {
                 if ($req->query('forceLogin') || !$currentUser->isLoggedIn()) {
                     // log the user in
                     $this->app['auth']->signInUser($user->id(), 'twitter');
                 } else {
                     // inform the user that the twitter account they are trying to
                     // connect belongs to someone else
                     return new View('switchingAccounts/twitter', ['title' => 'Switch accounts?', 'otherUser' => $user, 'otherProfile' => $user->twitterProfile()]);
                 }
             }
             $profile = new TwitterProfile($tid);
             // create or update the profile
             if ($profile->exists()) {
                 $profile->set($profileUpdateArray);
             } else {
                 $profile = new TwitterProfile();
                 $profile->create($profileUpdateArray);
             }
             // refresh profile from API
             $profile->refreshProfile($user_profile);
             return $this->finalRedirect($req, $res);
         } else {
             // show finish signup screen
             $req->setSession('tid', $tid);
             return $res->redirect('/signup/finish');
         }
     }
     if ($currentUser->isLoggedIn()) {
         // add to current user's account
         $currentUser->set('twitter_id', $tid);
     } else {
         // save this for later
         $req->setSession('tid', $tid);
     }
     $profile = new TwitterProfile($tid);
     // create or update the profile
     if ($profile->exists()) {
         $profile->set($profileUpdateArray);
     } else {
         $profile = new TwitterProfile();
         $profile->create($profileUpdateArray);
     }
     // refresh profile from API
     $profile->refreshProfile($user_profile);
     // get outta here
     if ($currentUser->isLoggedIn()) {
         $this->finalRedirect($req, $res);
     } else {
         $res->redirect('/signup/finish');
     }
 }