好的,我读了如何在我的应用程序中实现Laravel社交网站,以便我可以让用户使用Google或Facebook登录。我读了怎么做here。我遇到的问题是,如果用户使用电子邮件myemail@example.com从Google登录,然后使用myemail@example.com从Facebook登录,他们将登录到同一帐户!安全问题吧。所以我想在我让他们登录之前我会检查你可以获得的提供者ID,但是当我尝试比较我在数据库中存储的provider_id时,他们使用存储在socialite用户变量I中的provider_id创建帐户得到这个错误:
传递给Illuminate \ Auth \ SessionGuard :: login()的参数1必须实现接口Illuminate \ Contracts \ Auth \ Authenticatable,给出Illuminate \ 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 :(得分:0)
错误消息实际上是自我解释的。
执行User::where('provider_id', $social_user->id)
时,最终会生成实现
Illuminate\Database\Eloquent\Builder
。
您可以在其上调用->get()
以获取结果集合
(实现
Illuminate\Contracts\Auth\Authenticatable
在你的情况下,所以你可以迭代它们),或者像你一样,你可以得到第一个匹配->first()
(一个实现的对象
Illuminate\Contracts\Auth\Authenticatable
)。
您可以在Eloquent文档中阅读更多内容。
重点是,在调用->get()
或->first()
之前,您正在使用构建器对象。
实际上还有->find()
方法用于通过pk检索记录,你不能用它来通过约束来搜索记录(where
),但它也会返回模型对象。
答案 1 :(得分:0)
我遇到的这种方法的问题是,如果用户登录 来自谷歌的电子邮件myemail@example.com然后登录 Facebook使用myemail@example.com他们正在登录相同的 帐户!安全问题权利。
在我看来,这是一个不正确的假设。这不是安全问题。
OAuth用作身份验证委派,如果用户使用相同的电子邮件控制不同提供商中的帐户,则只是意味着他有更多第三方OAuth服务来验证对其身份的控制(电子邮件)
我认为这是一个错误,如果您限制我只能使用一个OAuth提供商登录,并禁止我使用同一封电子邮件再次使用另一个。