2016-05-15 13 views
0

Ok, ich lese, wie Laravel Socialite in meiner Anwendung zu implementieren, damit ich Benutzer mit Google oder Facebook einloggen können. Ich lese, wie man es macht here. Das Problem, auf das ich bei diesem Ansatz stoße, ist Folgendes: Wenn sich ein Benutzer von Google per E-Mail [email protected] anmeldet und sich von Facebook aus unter [email protected] anmeldet, loggt er sich in dasselbe Konto ein! Sicherheitsfrage richtig. Also dachte ich, bevor ich sie einloggen ließ, würde ich die Provider-ID überprüfen, die Sie bekommen können, wenn ich versuche, die provider_id, die ich in der Datenbank ablege, zu vergleichen, wenn sie das Konto mit der in der socialite-Benutzervariablen I gespeicherten provider_id erstellt erhalten diese Fehlermeldung:Laravel Socialite - Verschiedene Anbieter mit der gleichen E-Mail - Sicherheit Wie zu beheben

Argument 1 geben \ Auth \ SessionGuard :: Anmelden Illuminate() muss Schnittstelle Illuminate \ Verträge \ Auth \ authentifizierbarer, Instanz von Illuminate \ Http \ RedirectResponse gegeben

Hier ist der gesamte Code implementieren Ich benutze für Socialite:

<?php 

namespace App\Http\Controllers; 
use Socialite; 
use App\User; 
use Auth; 
use Illuminate\Support\Facades\Redirect; 
use Flash; 
use Illuminate\Http\Request; 
use App\Http\Requests; 

class SocialiteController extends Controller 
{ 

    public function redirectToProvider($provider) 
    { 
     return Socialite::driver($provider)->redirect(); 
    } 

    public function handleProviderCallback($provider) 
    { 
     try 
     { 
      $social_user = Socialite::driver($provider)->user(); 
     } 
     catch(Exception $e) 
     { 
      return Redirect::to('auth/' . $provider); 
     } 
     $authUser = $this->findOrCreateUser($social_user); 
     Auth::login($authUser, true); 
     flash()->overlay('You have been logged in successfully!', 'Congratulations'); 
     return Redirect::to('/'); 

    } 
    //create a new user in our database or grab existing user 
    private function findOrCreateUser($social_user) 
    { 
     if ($authUser = User::where('email', $social_user->email)->first()) { 
      //this creates an error 
      if($authUser->provider_id == $social_user->id) 
       return $authUser; 
      else 
      { 
       flash()->overlay('An account for that email already exists!', 'Error'); 
       return Redirect::to('/'); 
      } 
     } 


     return User::Create([ 
      'provider_id' => $social_user->id, 
      'name' => $social_user->name, 
      'email' => $social_user->email, 
      'nickname' => $social_user->nickname, 
      'avatar_img' => $social_user->avatar, 
      'role_id' => 1, //set role to guest 
      'social_login' => true //tell the database they are logging in from oauth 

     ]); 

    } 
} 

Antwort

0

Die Fehlermeldung ist eigentlich selbst expl ausgezeichnet. Wenn Sie User::where('provider_id', $social_user->id) tun, enden Sie mit Builder-Objekt, das

Illuminate\Database\Eloquent\Builder implementiert.

Sie können ->get() auf nennen es die Sammlung der Ergebnisse (eine Sammlung von Objekten, die

Illuminate\Contracts\Auth\Authenticatable

in Ihrem Fall implementiert, so dass man über sie laufen kann) zu bekommen, oder wie Sie taten, Sie können die erste Übereinstimmung mit ->first() erhalten (ein Objekt, das

Illuminate\Contracts\Auth\Authenticatable implementieren).

Sie können mehr in der eloquenten Dokumentation lesen.

Der Hauptpunkt ist, dass Sie bis zum Aufruf ->get() oder ->first() mit Builder-Objekt arbeiten. Es gibt tatsächlich ->find() Methode auch, die zum Abrufen von Datensatz von PK verwendet wird, können Sie nicht verwenden, um Datensätze nach Einschränkungen (where) suchen, aber es gibt auch Modellobjekt zurück.

+0

Diese Antwort wurde ursprünglich hier gepostet: http://stackoverflow.com/questions/37247380/laravel-socialite-user-getid – Magearlik

0

The problem I encounter with this approach is that if a user logs in from say Google with email [email protected] then logs in from Facebook using [email protected] they are logging into the same account! Security issue right.

Meiner Meinung nach ist dies eine falsche Annahme. Es ist kein Sicherheitsproblem.

OAuth als Authentifizierungs-Delegation verwendet wird, wenn ein Benutzer-Accounts in verschiedenen Anbietern mit derselben E-Mail steuert, bedeutet es einfach, er mehr 3rd-Party-OAuth Dienstleistungen, mit denen die Kontrolle über seine Identität (E-Mail)

zu validieren hat Ich würde es als einen Fehler betrachten, wenn Sie mich darauf beschränken, mich nur mit einem OAuth-Provider anmelden zu können, und mir nicht erlaubt haben, einen anderen mit der gleichen E-Mail zu verwenden.