Laravel 4 Auth с Facebook (без аутентификации по паролю)

Я пытаюсь настроить систему аутентификации с помощью Laravel 4 с логином Facebook. Я использую пакет madewithlove/laravel-oauth2 для Laravel 4.

Конечно, нет пароля для добавления в мою базу данных при входе пользователя в Facebook. Однако я пытаюсь проверить, находится ли идентификатор пользователя в базе данных, чтобы определить, следует ли мне создать новую сущность или просто войти в текущую. Я хотел бы использовать команды Auth для этого. У меня есть таблица под названием «фанаты».

Вот с чем я работаю:

 $fan = Fan::where('fbid', '=', $user['uid']);

                if(is_null($fan)) {

                  $fan = new Fan;

                  $fan->fbid = $user['uid'];
                  $fan->email = $user['email'];
                  $fan->first_name = $user['first_name'];
                  $fan->last_name = $user['last_name'];
                  $fan->gender = $user['gender'];
                  $fan->birthday = $user['birthday'];
                $fan->age = $age;
                $fan->city = $city;
                $fan->state = $state;
                  $fan->image = $user['image'];

                  $fan->save();

                  return Redirect::to('fans/home');

                }

                else {

                  Auth::login($fan);
                  return Redirect::to('fans/home');

               }

Модель вентилятора:

<?php

class Fan extends Eloquent {
    protected $guarded = array();

    public static $rules = array();
}

Когда я запускаю это, я получаю сообщение об ошибке:

Argument 1 passed to Illuminate\Auth\Guard::login() must be an instance of Illuminate\Auth\UserInterface, instance of Illuminate\Database\Eloquent\Builder given

РЕДАКТИРОВАТЬ: Когда я использую: $fan = Fan::where('fbid', '=', $user['uid'])->first();

Я получаю сообщение об ошибке:

Argument 1 passed to Illuminate\Auth\Guard::login() must be an instance of Illuminate\Auth\UserInterface, null given, called in /Applications/MAMP/htdocs/crowdsets/laravel-master/vendor/laravel/framework/src/Illuminate/Auth/Guard.php on line 368 and defined

Я не знаю, почему он дает мне эту ошибку. Есть ли у вас предложения о том, как я могу сделать эту работу? Спасибо за помощь.


person user1072337    schedule 02.07.2013    source источник
comment
вы можете показать свой код для фан-класса ??   -  person Trying Tobemyself    schedule 02.07.2013
comment
Добавлен код модели вентилятора.   -  person user1072337    schedule 02.07.2013
comment
Ошибка объясняет все это ... вы расширяете свою модель поклонника, чтобы использовать Eloquent, где для работы Auth вы также должны реализовать UserInterface, RemindableInterface   -  person Trying Tobemyself    schedule 02.07.2013
comment
Как мне это сделать? Я попытался написать реализацию UserInterace в верхней части модели, и это выдало мне ошибку.   -  person user1072337    schedule 02.07.2013
comment
вы ссылались на UserInterface, например, на use Illuminate\Auth\UserInterface;   -  person Trying Tobemyself    schedule 02.07.2013
comment
да, я все еще получаю ту же ошибку.   -  person user1072337    schedule 02.07.2013
comment
у кого-нибудь есть идеи по этому вопросу здесь? stackoverflow.com/questions/21506327/   -  person patrick    schedule 02.02.2014


Ответы (2)


Вы должны внедрить UserInterface в свою модель, чтобы Auth работал правильно.

use Illuminate\Auth\UserInterface;
class Fan extends Eloquent implements UserInterface{
...
public function getAuthIdentifier()
{
    return $this->getKey();
}

/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()
{
    return $this->password;
}
}

getAuthIdentifier и getAuthPassword являются абстрактными методами и должны быть реализованы в вашем классе, реализующем UserInterface.

person Trying Tobemyself    schedule 02.07.2013
comment
у вас также есть какие-либо идеи по этому вопросу здесь? stackoverflow.com/questions/21506327/ - person patrick; 02.02.2014

Чтобы войти в систему любому пользователю, вам нужно использовать модель User, и я уверен, что унаследованные классы тоже помогут, но я не уверен.

В любом случае, ваша модель Fan никак не связана с моделью/таблицей User, и это проблема. Если ваша модель имеет отношение belong_to или has_one и поле user_id, вы можете заменить Auth::login($user) на Auth::loginUsingId(<some id>).


Оригинальный ответ:

Вам не хватает дополнительного вызова метода: ->get() или ->first() для фактического получения результатов:

$fan = Fan::where('fbid', '=', $user['uid'])->first();

Кроме того, вы можете создать исключение, чтобы увидеть, что происходит:

$fan = Fan::where('fbid', '=', $user['uid'])->firstOrFail();

Если вы видите другие ошибки, обновите свой вопрос с этими ошибками.

person Ast Derek    schedule 02.07.2013
comment
Я попробовал это так, и это просто дало мне другую, но похожую ошибку. - person user1072337; 02.07.2013
comment
Странно, вы проверяете нулевые значения, но все равно получаете ошибку о нулевом значении - person Ast Derek; 02.07.2013
comment
любые другие идеи? Я действительно ценю твою помощь. - person user1072337; 02.07.2013
comment
Я изменил модель аутентификации по умолчанию в auth.php с User на Fan. Я также изменил таблицу аутентификации на поклонников, а не на пользователей по умолчанию, поэтому я не думаю, что это проблема. - person user1072337; 02.07.2013
comment
Сколько Fan строк в таблице? Вы видите какие-либо ошибки, если попробуете это?: $fan = Fan::create(array( 'email' => '[email protected]' )); $fan-save(); Auth::loginUsingId($fan->id); - person Ast Derek; 02.07.2013
comment
@AstDerek, у вас тоже есть идеи по этому вопросу? stackoverflow.com/questions/21506327/ - person patrick; 02.02.2014