我正在使用社交名称来允许我的用户注册并使用他们的社交帐户登录,例如Facebook, Twitter, Google+
,但它不起作用,会出现此错误:
这是我的LoginController
public function redirectToProvider()
{
return Socialite::driver('facebook')->redirect();
}
public function handleProviderCallback()
{
try{
$user = Socialite::driver('facebook')->user();
$user->token;
} catch (\Exception $e) {
return redirect()->intended('jobseekers/login');
}
$authUser = $this->findOrCreate($user);
Auth::login($authUser, true);
return redirect()->intended('jobseekers');
}
public function findOrCreate($facebookUser)
{
$authUser = User::where('id', $facebookUser->id)->first();
if($authUser)
{
Session::flash('success', 'Welcome, You are successfully Registered with your Facebook account');
return $authUser;
}
return User::create([
$user->id = $facebookUser->id,
$user->first_name = $facebookUser->name,
$user->last_name = $facebookUser->name,
$user->image = $facebookUser->avatar,
$user->email = $facebookUser->email,
]);
}
PS:上面的代码不会注册用户并返回错误但在此之前我使用下面的代码并注册用户但不会给他们密码因此他们无法登录这就是为什么我将代码更改为上面的代码:
public function redirectToProvider()
{
return Socialite::driver('facebook')->redirect();
}
public function handleProviderCallback()
{
$userSocial = Socialite::driver('facebook')->user();
$findUser = User::where('email', $userSocial->email)->first();
if ($findUser) {
Auth::login($findUser);
return redirect()->route('user.index');
}else{
$user = new User;
$user->id = $userSocial->id;
$user->first_name = $userSocial->name;
$user->last_name = $userSocial->name;
$user->image = $userSocial->avatar;
$user->email = $userSocial->email;
$user->save();
Auth::login($user);
Session::flash('success', 'Welcome, You are successfully Registered with your Facebook account');
return redirect()->route('user.index');
}
}
在上面的代码之前我使用了
更新
如果我从我的代码中删除else{ ... }
,用户将注册但与没有密码的第二个代码相同,因此用户无法登录。
答案 0 :(得分:0)
我解决了我的问题,这是最终代码:
public function handleProviderCallback()
{
try {
$user = Socialite::driver('facebook')->fields([
'first_name', 'last_name', 'email', 'gender'
])->scopes(['first_name', 'last_name'])->user();
} catch (Exception $e) {
return redirect()->route('user.index');
}
$authUser = $this->findOrCreateUser($user);
Auth::login($authUser, true);
return redirect()->route('jobseeker.profile');
}
/**
* Return user if exists; create and return if doesn't
*
* @param $facebookUser
* @return User
*/
private function findOrCreateUser($facebookUser)
{
$authUser = User::where('fb_id', $facebookUser->id)->first();
if ($authUser){
return $authUser;
}
return User::create([
'fb_id' => $facebookUser->id,
'first_name' => $facebookUser->user['first_name'],
'last_name' => $facebookUser->user['last_name'],
'username' => $facebookUser->user['last_name'],
'avatar' => $facebookUser->avatar,
'email' => $facebookUser->email,
'gender' => $facebookUser->user['gender'],
]);
}