Laravel 4 Auth with Facebook(无密码验证)

时间:2013-07-02 05:37:42

标签: facebook authentication laravel laravel-4

我正在尝试使用带有Facebook登录信息的Laravel 4建立身份验证系统。我正在为Laravel 4使用madewithlove / laravel-oauth2包。

当然,在用户登录Facebook时,没有密码可以添加到我的数据库中。但是,我正在尝试检查用户ID是否已在数据库中,以确定是否应创建新实体,或者只是登录当前实体。我想使用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

我不知道为什么它会给我这个错误。你对我如何做这项工作有什么建议吗?谢谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您必须为您的模型实现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的类中实现

答案 1 :(得分:0)

要将任何用户登录到系统中,您需要使用User模型,我打赌继承的类也可以做到这一点,但我不确定。

无论如何,您的Fan模型不会以任何方式与User模型/表关联,这是一个问题。如果您的模型具有belong_tohas_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();

如果您发现不同的错误,请使用这些错误更新您的问题。