2015-11-27 7 views
8

Я использую приложение Symfony2 для heroku, и я не могу подключиться к своему API.cURL timeout on heroku

Я объясняю вам сценарий:

  1. Я подключаем меня в моем приложении через форму
  2. Когда я правильно войти мое приложение, слушатель событий запускаются
  3. получить доступ к URL который доставляет мне фишку API, и я сохранить эти учетные данные в сеансе пользователя
  4. перенаправить подключенный (к приложению и к API) пользователя на домашнюю страницу приложения

Итак, моя проблема в точке 3. Я попытался с помощью cURL и file_get_contents получить доступ к URL-адресу, и оба они не работают.

Когда я пытаюсь получить доступ к URL-адресу, который доставляет мне токен OAuth, необходимый для доступа к моему API, он терпит неудачу. Я попытался получить доступ к этому URL вручную в браузере (или Postman), и он хорошо отображает токен OAuth.

Слушатель события:

 // Call of the url to deliver the token 
     $clientAPI = $this->em->getRepository('BgAPIBundle:Client')->findOneBy(array('providerAccess' => 'pcv')); 
     $curl = curl_init(); 
     curl_setopt($curl, CURLOPT_URL, urldecode($this->router->generate('fos_oauth_server_token', array('grant_type' => 'http://www.myapp/api/grants/api_key', 'client_id' => $clientAPI->getId() . '_' . $clientAPI->getRandomId(), 'client_secret' => $clientAPI->getSecret(), 'api_key' => $event->getAuthenticationToken()->getUser()->getApiKey()), true))); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl, CURLOPT_COOKIESESSION, true); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
     $response = curl_exec($curl); 
     $this->error = $response; // Only if there is problem 
     curl_close($curl); 

     // Write in logs 
     $date = new \DateTime('now'); 
     if (preg_match('#error#', $this->error)) { 
      $this->logger->error('Error on authentication success to deliver the OAuth token for ' . $event->getAuthenticationToken()->getUser() . ' the ' . $date->format('j/m/Y - H:i:s') . ' with message : ' . $this->error); 
     } 

Ошибка из Heroku и моих журналов:

heroku/router: at=error code=H12 desc="Request timeout" method=GET path="/app_dev.php/oauth/v2/token?grant_type=http://www.app/api/grants/api_key&client_id=261_1ws6mvgmbeisgcsw4wokwk8k400og88gs0csssg0gk0884080s&client_secret=1ghmf01c1a4kc448ssgwg8sw04840c4ww8k00gg4o0k8w04g4&api_key=7f5284ac5ec8b35527d3c16dafa52a89" host=app-max.herokuapp.com request_id=dc8960fd-d154-4e5d-bc2f-34d4f25b8070 fwd="46.51.146.244" dyno=web.1 connect=0ms service=30006ms status=503 bytes=0 
app.ERROR: Une erreur est survenue lors de l'attribution du token OAuth de [email protected] le 25/11/2015 - 16:12:40 avec le message : <!DOCTYPE html>  <html>  <head>  <meta name="viewport" content="width=device-width, initial-scale=1">  <style type="text/css">   html, body, iframe { margin: 0; padding: 0; height: 100%; }   iframe { display: block; width: 100%; border: none; }  </style>  <title>Application Error</title>  </head>  <body>  <iframe src="//s3.amazonaws.com/heroku_pages/error.html">   <p>Application Error</p>  </iframe>  </body>  </html> [] [] 

Спасибо за вашу помощь!

+1

Вы пытались установить 'CURLOPT_TIMEOUT'? Например: 'curl_setopt ($ curl, CURLOPT_TIMEOUT, 60);' – scoolnico

+0

Спасибо за ваш ответ, но да, я пробовал и не работает –

+0

, а что насчет 'USERAGENT'? 'curl_setopt ($ curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux x86_64; ru-US) AppleWebKit/537.36 (KHTML, например, Gecko) Chrome/41.0.2225.0 Safari/537.36');' – scoolnico

ответ

3

Я нашел решение:

EventListener

$tokenController = new FOS\OAuthServerBundle\Controller\TokenController($this->oauth2); // $this->oauth2 is the @fos_oauth_server.server service 
$credentials = $tokenController->tokenAction($request); 
$response = $credentials->getContent(); 

Это просто другое решение войти в мой API, Whithout с помощью CURL и URL, которые дают маркер.