2016-08-05 36 views
1

Ok, bare mit mir auf meine Erklärung: Ich habe ein Login-System, mit dem ein Benutzer sich anmelden oder einloggen mit Facebooks API.Erlaube Facebook api das Hinzufügen von E-Mail zu DB, wenn einer bereits eingestellt ist

Ich habe einen Code hinzugefügt, um zu prüfen, ob eine E-Mail existiert, die der Facebook-E-Mail entspricht, und wenn ja, füge die Facebook-ID zu dieser Zeile in der Datenbank hinzu.

Ich habe auch eine Option in meinen Kontoeinstellungen, die es einem Benutzer ermöglicht, seine E-Mail-Adresse zu ändern.

Das Problem, das ich habe, ist, dass, wenn ein Benutzer seine E-Mail-Adresse ändert, nachdem er eine Facebook-ID erhalten hat, wenn ein Benutzer sich wieder bei meiner Website anmeldet, wird seine E-Mail auf die E-Mail auf ihrem Facebook-Konto aktualisiert.

Ich möchte immer noch erlauben User :: createOrUpdateGraphNode ($ facebook_user) eine E-Mail zu meiner Datenbank nur hinzufügen, wenn eine E-Mail nicht existiert, daher für einen neuen Benutzer.

Aber nicht, wenn eine E-Mail bereits existiert. Wenn ein Nutzer seine E-Mail-Adresse ändert, hat dies keine Auswirkungen auf die Anmeldung bei Facebook.

weiß, dass ich ich von

protected static 

    $graph_node_field_aliases = [ 
      'id' => 'facebook_id', 
      // 'name' => 'name', 
      //'email' => 'email', 
     ]; 

entfernen konnte, aber dann wird es nicht die E-Mail in meinem db, wenn sich ein neuer Benutzer anmeldet hinzufügen.

alles in dieser Funktion vor sich geht: createOrUpdateGraphNode($facebook_user) so dass ich nicht sicher bin, wie etwa vielleicht gehen ein, wenn so etwas wie dies zum Beispiel das Hinzufügen:

if($user->facebook_id == facebook_id && $user->email) { 
    do something 
} 

Ich verwende sammyklaravel/facebooksdk https://github.com/SammyK/LaravelFacebookSdk

die Facebook-Rückruf sieht wie folgt aus:

function facebookCallBack(LaravelFacebookSdk $fb) { 
    // Obtain an access token. 
try { 
    $token = $fb->getAccessTokenFromRedirect(); 
} catch (Facebook\Exceptions\FacebookSDKException $e) { 
    dd($e->getMessage()); 
} 

// Access token will be null if the user denied the request 
// or if someone just hit this URL outside of the OAuth flow. 
if (! $token) { 
    // Get the redirect helper 
    $helper = $fb->getRedirectLoginHelper(); 

    if (! $helper->getError()) { 
     abort(403, 'Unauthorized action.'); 
    } 

    // User denied the request 
    dd(
     $helper->getError(), 
     $helper->getErrorCode(), 
     $helper->getErrorReason(), 
     $helper->getErrorDescription() 
    ); 
} 

if (! $token->isLongLived()) { 
    // OAuth 2.0 client handler 
    $oauth_client = $fb->getOAuth2Client(); 

    // Extend the access token. 
    try { 
     $token = $oauth_client->getLongLivedAccessToken($token); 
    } catch (Facebook\Exceptions\FacebookSDKException $e) { 
     dd($e->getMessage()); 
    } 
} 

$fb->setDefaultAccessToken($token); 

// Save for later 
Session::put('fb_user_access_token', (string) $token); 

// Get basic info on the user from Facebook. 
try { 
    $response = $fb->get('/me?fields=id,name,email'); 
} catch (Facebook\Exceptions\FacebookSDKException $e) { 
    dd($e->getMessage()); 
} 

// Convert the response to a `Facebook/GraphNodes/GraphUser` collection 
$facebook_user = $response->getGraphUser(); 
// dd($facebook_user['email']); 


// Create the user if it does not exist or update the existing entry. 
// This will only work if you've added the SyncableGraphNodeTrait to your User model. 
$user = User::where('email', $facebook_user['email'])->first(); 

if(isset($user)) { 
    // // Convert the response to a `Facebook/GraphNodes/GraphUser` collection 
    $facebook_user = $response->getGraphUser(); 
    $current_user = $user; 
    $current_user->facebook_id = $facebook_user['id']; 
    $current_user->save(); 
} else { 

$user = User::createOrUpdateGraphNode($facebook_user); 

} 

// Log the user into Laravel 
Auth::login($user); 

if (Auth::user()->terms && Auth::user()->active) { 
    return redirect()->route('home'); 
} 

$active = 1; 
Auth::user()->update([ 
    'active' => $active, 
]); 

return redirect()->route('auth.signupdetails'); 
} 

Antwort

0

Ok ich eine Lösung gefunden, nicht es ist nicht so elegant aber es ist nicht schlecht, es funktioniert. Wenn jemand das eleganter machen kann oder wenn Sie irgendwelche Bedenken sehen, lassen Sie bitte eine Zeile fallen. Hier ist, was ich tat:

I $user = User::createOrUpdateGraphNode($facebook_user) ersetzt

mit

if($user = User::where('email', $facebook_user['email'])->where('active', true)->first()) { 
    // // Convert the response to a `Facebook/GraphNodes/GraphUser` collection 
    $facebook_user = $response->getGraphUser(); 
    $current_user = $user; 
    $current_user->facebook_id = $facebook_user['id']; 
    $current_user->save(); 
} // if facebook id exist in databse, just update 
elseif ($user = User::where('facebook_id', $facebook_user['id'])->first()) { 

    $facebook_user = $response->getGraphUser(); 
    $current_user = $user; 
    $current_user->facebook_id = $facebook_user['id']; 
    $current_user->save(); 

} // if user facebook id and no email matching facebook's email is in the database, create new user 
else { 
    $facebook_user = $response->getGraphUser(); 

    $user = User::create([ 
     'email' => $facebook_user['email'], 
     'facebook_id' => $facebook_user['id'], 
    ]); 
} 

// Log the user into Laravel 
Auth::login($user);