2017-07-22 14 views
0

Laravel 5.4のSocialiteを通じてTwitterログインを持つサイトをまとめています。今すぐユーザーがログインすると、私はホームページにリダイレクトされます。しかし、私は彼が "Twitterでサインイン"リンクを有効にしていたどのページにでもユーザーをリダイレクトできるようにしたいと思います。私はreturn redirect()->back()を使ってみましたが、最後のリクエストはTwitterのapiにあったので、無限ループが発生します。私はこれがかなり基本的でなければならないと確信していますが、私はそれを理解できないようです。これは私の認証要求を処理するコントローラである:あなたが欲しいTwitterのログイン後、Laravel 5.4とSocialiteが呼び出しページにリダイレクト

<?php 

namespace App\Http\Controllers\Auth; 

use App\Http\Controllers\Controller; 
use App\User; 
use Illuminate\Support\Facades\Auth; 
use Laravel\Socialite\Facades\Socialite; 

class AuthController extends Controller 
{ 
    /** 
    * Where to redirect users after login. 
    * 
    * @var string 
    */ 
    protected $redirectPath = '/home'; 

    /** 
    * Redirect user to OAuth Provider. 
    * 
    * @param $provider 
    * @return Response 
    */ 
    public function redirectToProvider($provider) 
    { 
     return Socialite::driver($provider)->redirect(); 
    } 

    /** 
    * Obtain the user information from provider. check if user already 
    * exists in our db by looking up their provider_id in the db. 
    * If user exists, log them in. Otherwise, create a new user then log them in. 
    * After login, redirect them to the authenticated users homepage. 
    * 
    * @param $provider 
    * @return Response 
    */ 
    public function handleProviderCallback($provider) 
    { 
     try { 
      $user = Socialite::driver($provider)->user(); 
     } catch (Exception $e) { 
      return redirect("auth/$provider"); 
     } 
     $authUser = $this->findOrCreateUser($user, $provider); 
     Auth::login($authUser, true); 

     return redirect($this->redirectPath); 
    } 

    /** 
    * If a user has registered before using social auth, return the user 
    * else, create a new user object. 
    * 
    * @param $user Socialite user object 
    * @param $provider Social auth provider 
    * @return User 
    */ 
    public function findOrCreateUser($user, $provider) 
    { 
     $authUser = User::where('provider_id', $user->id)->first(); 
     if ($authUser) { 
      return $authUser; 
     } 

     return User::create([ 
      'name'  => $user->name, 
      'handle'  => $user->nickname, 
      'provider' => $provider, 
      'provider_id' => $user->id, 
      'avatar'  => $user->avatar_original, 
     ]); 
    } 

} 
+0

あなたは '意図された'関数を使うことができます –

答えて

0

はデフォルトLaravel認証動作です。

return $this->authenticated($request, $this->guard()->user()) 
    ?: redirect()->intended($this->redirectPath()); 

ユーザーが訪問/privatepageと、そのページは、ユーザーがログインページにリダイレクトされauth middleware/privatepageにより保護されている場合

url.intendedとしてセッションに保存されます。次に、認証が成功すると、 Laravelはセッションに url.intendedキーがあるかどうかをチェックし、そうであればセッションに保存されているURLにリダイレクトします。そうでない場合は、定義したページにリダイレクトされます。デフォルトは /homeです。

ユーザーが認証されたときの処理を手動で処理したい場合は、authenticated()という関数を手動でリダイレクトする代わりに呼び出すことができます。

OR

あなたはguest訪問者とlogged inユーザーのための共通のページを持っている場合は、このようなURLSessionに何か保存することができます:

Session::flash('url',Request::server('HTTP_REFERER')); 

をとして操作や認証の後にこれを使用します。

return redirect(Session::get('url')); 

希望これはあなたの問題を解決します。

+0

'Session :: flash( 'url'、Request :: server( 'HTTP_REFERER'));'のようなことをしました。 href = "{{{{url( '/ auth/facebook')}}?last-url = {!! htmlentities(request()){{href = (last_url '、request() - > query(' last() - > path())!!}} ''これを私の 'redirectToProvider()'関数に追加しました: '$ __ SERVER'変数を使ってリクエスト中にデータが既に送られているので、コードを少なくすることができます。 –

関連する問題