Auth ::用户与社交名流的会话

时间:2019-02-20 11:28:24

标签: php laravel

已解决问题

我有<a href='{{ Auth::logout }}'>Logout</a>导致每个页面都将用户注销。


app / Http / Controllers / SocialAuthFacebookController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Socialite;
use App\Services\SocialFacebookAccountService;
use Auth;

class SocialAuthFacebookController extends Controller
{
  /**
   * Create a redirect method to facebook api.
   *
   * @return void
   */
    public function redirect()
    {
        return Socialite::driver('facebook')->redirect();
    }

    /**
     * Return a callback method from facebook api.
     *
     * @return callback URL from facebook
     */
    public function callback(SocialFacebookAccountService $service)
    {
        $user = $service->createOrGetUser( Socialite::driver('facebook')->user() );
        Auth::login($user,true);
        return redirect()->to('/');
    }
}

app / SocialFacebookAccount.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class SocialFacebookAccount extends Model
{
  protected $fillable = ['user_id', 'provider_user_id', 'provider'];

  public function user()
  {
      return $this->belongsTo(User::class);
  }
}

app / Services / SocialFacebookAccountService.php

namespace App\Services;
use App\SocialFacebookAccount;
use App\User;
use Laravel\Socialite\Contracts\User as ProviderUser;

class SocialFacebookAccountService
{
    public function createOrGetUser(ProviderUser $providerUser)
    {
        $account = SocialFacebookAccount::whereProvider('facebook')
            ->whereProviderUserId($providerUser->getId())
            ->first();

        if ($account) {
            return $account->user;
        } else {

            $account = new SocialFacebookAccount([
                'provider_user_id' => $providerUser->getId(),
                'provider' => 'facebook'
            ]);

            $user = User::whereEmail($providerUser->getEmail())->first();

            if (!$user) {
                $user = User::create([
                    'email'    => $providerUser->getEmail(),
                    'name'     => $providerUser->getName(),
                    'password' => md5(rand(1,10000)),
                    'image'    => $providerUser->getAvatar(),
                ]);
            }

            $account->user()->associate($user);
            $account->save();

            return $user;
        }
    }
}

我目前正在使用Facebook,而且效果很好,所以这不是我要的。

我的master.blade.php上有此代码段,当我首次登录Facebook时它可以工作,但是当我转到另一页(例如/about)时,它退出了我。我已经尝试过Auth::viaRemember,但这无济于事。

我如何在会话中存储用户的凭据,以免仅因为移至另一个页面而注销用户?!

1 个答案:

答案 0 :(得分:0)

facebook api将使您的请求有效,并且仅提供一些基本的用户详细信息..您必须先将用户详细信息存储在数据库中(在fb api请求成功之后),然后必须使用保存的用户ID开始会话(使用AuthLoginUsingID函数)。