【问题标题】:Laravel Socialite - Different Providers With Same Email - Security How to FixLaravel Socialite - 具有相同电子邮件的不同提供商 - 安全性如何修复
【发布时间】:2017-04-15 03:08:35
【问题描述】:

好的,我阅读了如何在我的应用程序中实现 Laravel 社交名流,这样我就可以让用户使用 Google 或 Facebook 登录。我读了怎么做here。我在使用这种方法时遇到的问题是,如果用户使用电子邮件 myemail@example.com 从 Google 登录,然后使用 myemail@example.com 从 Facebook 登录,他们将登录到同一个帐户!安全问题对。所以我认为在让他们登录之前,我会检查您可以获得的提供者 ID,但是当我尝试比较他们创建帐户时存储在数据库中的 provider_id 与存储在社交名流用户变量中的 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

        ]);

    }
}

【问题讨论】:

    标签: laravel laravel-socialite


    【解决方案1】:

    错误信息实际上是自我解释的。 当您执行 User::where('provider_id', $social_user-&gt;id) 时,您最终会得到实现

    的构建器对象

    Illuminate\Database\Eloquent\Builder

    你可以在上面调用-&gt;get()来获取结果集合 (实现

    的对象集合

    Illuminate\Contracts\Auth\Authenticatable

    在你的情况下,你可以迭代它们),或者像你一样,你可以得到第一个匹配 -&gt;first() (一个实现

    的对象

    Illuminate\Contracts\Auth\Authenticatable)。

    您可以在 Eloquent 文档中阅读更多内容。

    主要的一点是,在您调用 -&gt;get()-&gt;first() 之前,您正在使用构建器对象。 其实还有-&gt;find()方法,就是用来通过pk检索记录的,不能用它来按约束搜索记录(where),但它也返回模型对象。

    【讨论】:

    【解决方案2】:

    我使用这种方法遇到的问题是,如果用户登录 从使用电子邮件 myemail@example.com 说谷歌,然后从 Facebook 使用 myemail@example.com 他们登录到同一个 帐户!安全问题权。

    在我看来,这是一个错误的假设。这不是安全问题。

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2020-04-10
      相关资源
      最近更新 更多