2016-08-05 5 views
1

私の説明で私と一緒にいてください:FacebookのAPIを使用してユーザーがサインアップまたはログインできるログインシステムがあります。Facebook APIが既に設定されている場合、Facebookにapiがメールを追加しないようにしてください。

私はFacebookの電子メールに一致する電子メールが存在するかどうかを確認するコードを追加しました。もしそうなら、FacebookのIDをデータベースのその行に追加します。

私のアカウント設定では、ユーザーがメールアドレスを変更できるオプションもあります。

FacebookのIDを取得した後にユーザーがメールアドレスを変更すると、次回ユーザーがログアウトして自分のサイトに戻ったときに、自分の電子メールがFacebookアカウントのメールに更新されるという問題があります。

私はまだ電子メールが存在しない場合、つまり新しいユーザのために、User :: createOrUpdateGraphNode($ facebook_user)がデータベースに電子メールを追加することを許可します。

電子メールが既に存在する場合は表示されません。ユーザーが自分のメールを変更しても、Facebookにログインしてもそれには影響しません。

は、私は私が

protected static 

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

から削除することもできます知っているが、それは私のデシベル新しいユーザーがサインアップして電子メールを追加しません。

すべてがこの機能に起こっている:

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

私が使用しているsammyklaravel/facebooksdk https://github.com/SammyK/LaravelFacebookSdk

createOrUpdateGraphNode($facebook_user) はので、私は例えば、このような何かあれば追加について多分行くするかどうかはわかりません

Facebookのコールバックは、次のようになります。

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'); 
} 

答えて

0

[OK]を私はそれがエレガントではありませんが、解決策を見つけていません、それは悪くない、それは動作します。いずれかの人がこれをよりエレガントにすることができれば、または懸念がある場合は、行を削除してください。ここに私がやったことだ:

私は

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); 
$user = User::createOrUpdateGraphNode($facebook_user)

を置き換え

関連する問題