2016-05-15 9 views
0

私はアプリケーションにLaravel socialiteを実装する方法を読んで、ユーザーにGoogleやFacebookを使用してログインさせることができます。私はそれを行う方法を読むhere。私がこのアプローチで遭遇する問題は、ユーザーが[email protected]を使ってGoogleから電子メールでログインすると、[email protected]を使用してFacebookからログインし、同じアカウントにログインしていることです。セキュリティ問題の権利。だから私は彼らにログインさせる前に、あなたが得ることができるプロバイダIDを調べるだろうと思っていましたが、私がsocialiteユーザ変数Iに格納されているprovider_idでアカウントを作成したときにデータベースに保存したprovider_idを比較しようとすると、このエラーを取得:(\認証\ SessionGuard ::ログインを照らすために渡さLaravel Socialite - 同じメールのプロバイダが異なる - セキュリティの修正方法

引数1)インタフェースを照らし\契約が認証\認証可能に\実装する必要があり、ここで

を与え照らしなさい\のHttp \ RedirectResponseのインスタンスはすべてのコードです私は社会人のために使用しています:

<?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 

     ]); 

    } 
} 

答えて

0

エラーメッセージは実際には自己解読ですained。 User::where('provider_id', $social_user->id)を実行すると、最終的に

Illuminate\Database\Eloquent\Builderを実装するビルダーオブジェクトが作成されます。

あなたは(あなたのケースで

Illuminate\Contracts\Auth\Authenticatable

を実装するオブジェクトのコレクションは、あなたがそれらを反復処理することができます)結果 のコレクションを取得するには、それに->get()を呼び出すことができます、またはあなたが行ったように、 ->first()

Illuminate\Contracts\Auth\Authenticatableを実装する1つのオブジェクト)との最初の一致を得ることができます。

詳しくは、Eloquentのドキュメントを参照してください。

主なポイントは、->get()または->first()を呼び出すまで、ビルダーオブジェクトを使用していることです。 実際には->find()メソッドもあります。これはpkでレコードを取得するために使用され、制約(where)でレコードを検索するためには使用できませんが、モデルオブジェクトも返します。

+0

この回答は、もともとの投稿です: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.

私の意見では、これは間違った前提です。セキュリティの問題ではありません。

のOAuthは、ユーザーが同じ電子メールと異なるプロバイダにアカウントを制御する場合、それは単に(電子メール)、彼は彼のアイデンティティの制御を検証するとともに、よりサードパーティのOAuthのサービスを有することを意味する、認証の委任として使用されている

1つのOAuthプロバイダでのみサインインできるように制限して、同じメールで別のユーザーを使用することを禁止した場合はバグだと思っています。

関連する問題