/**
  * Tries to authenticate a user
  * @param Request $request The request
  * @return \Exception|RedirectResponse Returns an exception when authentication fails, or a redirect response when a redirect is required
  * @throws \fkooman\OAuth\Client\Exception\ApiException
  */
 public function tryAuthentication(Request $request)
 {
     $this->clientConfig->setRedirectUri($request->getUri());
     if ($request->query->has('code') || $request->query->has('error')) {
         try {
             $this->callback->handleCallback($request->query->all());
         } catch (AuthorizeException $ex) {
             return $ex;
         } catch (CallbackException $ex) {
             return $ex;
         }
     }
     if ($request->query->has('code')) {
         $request->query->remove('code');
         $request->query->remove('state');
         $request->server->set('QUERY_STRING', http_build_query($request->query->all()));
         return new RedirectResponse($request->getUri());
     }
     if (!$this->getAccessToken()) {
         return new RedirectResponse($this->api->getAuthorizeUri($this->context));
     }
 }