首页 文章

Laravel Socialite - 具有相同电子邮件的不同提供商 - 安全性如何修复

提问于
浏览
0

好的,我读了如何在我的应用程序中实现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的实例

以下是我为Socialite使用的所有代码:

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

        ]);

    }
}

2 回答

  • 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 ),但它也返回模型对象 .

  • 0

    我遇到的问题是,如果用户使用电子邮件myemail@example.com从Google登录,然后使用myemail@example.com从Facebook登录,他们将登录到同一帐户!安全问题吧 .

    在我看来,这是一个不正确的假设 . 这不是安全问题 .

    OAuth用作身份验证委派,如果用户使用相同的电子邮件控制不同提供商中的帐户,则只是意味着他有更多第三方OAuth服务来验证对其身份的控制(电子邮件)

    我认为这是一个错误,如果您限制我只能使用一个OAuth提供商登录,并禁止我使用相同的电子邮件再次使用另一个OAuth提供商 .

相关问题