2015-04-27 4 views
8

У меня есть веб-сайт (Symfony2) с HWIOauthBundle, используемым для связи с Facebook, и все работает нормально.HWIOAuthBundle, как вручную аутентифицировать пользователя с токеном доступа Facebook?

Теперь я пытаюсь создать приложение IOS с Кордова и Ионные каркасных (AngularJS), и я хочу, чтобы проверить подлинность моего пользователя с Facebook:

  1. С $cordovaFacebook, я проверить подлинность моего пользователя и получить действительный маркер доступа Facebook, что это нормально

  2. Я пытаюсь использовать этот маркер доступа для проверки подлинности моего пользователя на стороне сервера с HWIOauthBundle:

    GET http://..../login/facebook?code=MY_FACEBOOK_ACCESS_TOKEN 
    
  3. Symfony отклоняет мою просьбу с этим журналом:

    INFO - Matched route "facebook_login" (parameters: "_route": "facebook_login") 
    INFO - Authentication request failed: OAuth error: "Invalid verification code format." 
    

Так что мой вопрос: , как я могу проверить подлинность моего пользователя как на переднем и заднем конце с Facebook подключиться?

Спасибо :)

+0

В настоящее время глядя на ту же проблему - вы решили это? Если да, то как вы это решили? Ничего не найти! – iLikeBreakfast

+1

Да. Никто не знает, как это работает. Я имею в виду, вы можете легко сделать базу данных, а оттуда вы золотой. Но слишком сложно сделать что-нибудь обычное (например, LDAP, когда анонимная привязка не разрешена). И это очень грустно, потому что все остальное в рамках рамки красиво. – DinoAmino

+0

Это потому, что параметр «code» должен быть авторизационным кодом, а не токеном доступа ... Токен доступа будет фактически ответом на этот запрос. Но я тоже застрял, я бы хотел получить код авторизации с переднего конца, чтобы вернуться в процесс HWIOauth. – TrtG

ответ

3

Мне также интересно, как реализовать логин на стороне сервера с помощью HWIOAuthBundle. Я не нашел никакого решения в Интернете, поэтому я закодировал функциональность на основе подсказок, которые я читал в сети. В принципе, вы должны:

  1. аутентификации пользователя на приложение
  2. сделать запрос HTTP на сервер с маркером Facebook.
  3. на стороне сервера, проверьте, является ли токен для вашего приложения Facebook, и получите идентификатор пользователя Facebook.
  4. Получите своего пользователя из БД на основе полученного идентификатора.

Вот мой Symfony контроллер:

public function getSecurityFbAction($token) 
{ 
    // Get the token's FB app info. 
    @$tokenAppResp = file_get_contents('https://graph.facebook.com/app/?access_token='.$token); 
    if (!$tokenAppResp) { 
     throw new AccessDeniedHttpException('Bad credentials.'); 
    } 

    // Make sure it's the correct app. 
    $tokenApp = json_decode($tokenAppResp, true); 
    if (!$tokenApp || !isset($tokenApp['id']) || $tokenApp['id'] != $this->container->getParameter('oauth.facebook.id')) { 
     throw new AccessDeniedHttpException('Bad credentials.'); 
    } 

    // Get the token's FB user info. 
    @$tokenUserResp = file_get_contents('https://graph.facebook.com/me/?access_token='.$token); 
    if (!$tokenUserResp) { 
     throw new AccessDeniedHttpException('Bad credentials.'); 
    } 

    // Try to fetch user by it's token ID, create it otherwise. 
    $tokenUser = json_decode($tokenUserResp, true); 
    if (!$tokenUser || !isset($tokenUser['id'])) { 
     throw new AccessDeniedHttpException('Bad credentials.'); 
    } 
    $userManager = $this->get('fos_user.user_manager'); 
    $user = $userManager->findUserBy(array('facebookId' => $tokenUser['id'])); 

    if (!$user) { 
     // Create user and store its facebookID. 
    } 

    // Return the user's JSON web token for future app<->server communications. 
} 

я бросить Symfony \ Component \ HttpKernel \ исключения Исключение \ AccessDeniedHttpException обработки ошибок входа в мое приложение.

Конечно, вы действительно должны использовать http s, потому что вы будете обмениваться разумной информацией.

Я не знаю, если это лучший способ сделать это, но он работает хорошо. Надеюсь, это поможет!

2

Ну, я думаю, что Symfony фактически не отклонит запрос. Facebook есть. Я не уверен, если это может помочь, но я знаю, что куча а проблемы могут произойти при работе с Facebook Auth:

  • Вы знаете, если инструмент посылает вместе с кодом параметра, a redirect_uri параметр? Если да, то:

  • Вы проверили, что ваш redirect_uri У вас есть конечная косая черта? See this

  • Глупый вопрос, но вы убедитесь, что ваш app_id тот же, когда вы получили уполномочил через Кордова?

  • Проверьте, что у вашего redirect_uri У нас нет параметров запроса.

  • Проверьте, что redirect_uri, которые вы используете в течение всего процесса, одинаковы все время.

В целом, мне кажется, что ваша проблема почти все время, связанные с форматом redirect_uri URI.

Смежные вопросы