2015-04-27 8 views
8

Ich habe eine Website (Symfony2) mit HWIOauthBundle mit Facebook verbinden und alles funktioniert.HWIOAuthBundle, wie Sie manuell authentifizieren Benutzer mit einer Facebook-Zugriffstoken?

Nun, ich versuche, eine iOS-App mit Cordova und Ionic Rahmen (AngularJS) zu bauen, und ich möchte, dass meine Benutzer mit Facebook authentifizieren:

  1. Mit $cordovaFacebook, ich meine Benutzer authentifizieren und eine bekommen gültig Facebook Zugriffstoken, das ist ok

  2. ich versuche, diese Zugriffstoken zu verwenden, um meine Benutzer auf der Server-Seite mit HWIOauthBundle zu authentifizieren:

    GET http://..../login/facebook?code=MY_FACEBOOK_ACCESS_TOKEN 
    
  3. Symfony lehnt meine Anfrage mit diesem Protokoll:

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

meine Frage ist also: wie kann ich meine Benutzer auf Front authentifizieren und mit Facebook verbinden Ende zurück?

Thanks :)

+0

Derzeit genau das gleiche Problem - haben Sie das gelöst? Wenn ja, wie hast du das gelöst? Kann nirgendwo etwas finden! – iLikeBreakfast

+1

Ja. Niemand weiß, wie es wirklich funktioniert. Ich meine, Sie können leicht Datenbankauthentifizierung durchführen und von dort sind Sie golden. Aber es ist viel zu kompliziert, um etwas benutzerdefiniertes zu tun (wie LDAP, wenn anonyme Bindung nicht erlaubt ist). Und es ist wirklich traurig, weil alles andere über den Rahmen schön ist. – DinoAmino

+0

Dies liegt daran, die „Code“ param soll ein Berechtigungscode nicht ein Zugriffstoken sein ... Der Token Zugriff tatsächlich die Antwort auf diese Anforderung sein. Aber ich stecke auch fest, ich möchte einen Autorisierungscode vom Frontend bekommen, damit ich zurück in den HWIOauth-Prozess kommen konnte. – TrtG

Antwort

3

Ich habe mich auch gefragt worden, wie eine Server-Seite Anmeldung mit dem HWIOAuthBundle zu implementieren. Ich fand keine Lösung auf dem Netz, so codierte ich die functionnality basierend auf Hinweisen die ich im Internet gelesen habe. Grundsätzlich , müssen Sie:

  1. die Benutzer auf Ihrer Anwendung authentifizieren
  2. machen eine HTTP-Anfrage an den Server mit den Facebook-Token.
  3. Auf der Server-Seite, überprüfen Sie, ob der Token für Ihre Facebook-App ist, und rufen Sie die Facebook-ID des Benutzers ab.
  4. Ermitteln Sie anhand der abgerufenen ID Ihren Benutzer aus der Datenbank.

Hier ist mein Symfony-Controller:

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. 
} 

Ich werfe die Symfony \ Component \ HttpKernel \ Exception \ AccessDeniedHttpException Ausnahmen Login Fehler auf meiner app zu behandeln.

Natürlich sollten Sie wirklich http s verwenden, weil Sie sinnvolle Informationen austauschen werden.

Ich weiß nicht, ob es der beste Weg ist, es zu tun, aber es funktioniert gut. Hoffe es hilft!

2

Nun, ich denke, dass Symfony nicht wirklich Ihre Anfrage ablehnen. Facebook ist. Ich bin mir nicht sicher, ob dies helfen könnte, aber ich weiß, dass ein Haufen ein Problem kann auftreten, wenn mit der Facebook-Auth zu tun:

  • Wissen Sie, ob das Tool sendet, zusammen mit den Code Parametern, ein redirect_uri Parameter? Wenn ja:

  • Haben Sie überprüft, dass Ihr redirect_uri HAS einen abschließenden Schrägstrich am Ende hat? See this

  • Dumme Frage, aber haben Sie überprüfen, ob Ihre app_id die gleiche ist, wenn Sie über Cordova autorisiert wurde?

  • Überprüfen Sie, ob Ihre redirect_uri KEINE im Abfrageparameter haben.

  • Überprüfen Sie, dass die redirect_uri, die Sie während des gesamten Prozesses verwenden, immer die gleiche ist.

Insgesamt scheint es, dass Ihr Problem ist fast die ganze Zeit in das Format redirect_uri URI verwendet.