首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数1传递给照明\Auth\Guard::login()必须实现接口照明\Auth\UserInterface,空打开:

参数1传递给照明\Auth\Guard::login()必须实现接口照明\Auth\UserInterface,空打开:
EN

Stack Overflow用户
提问于 2016-06-22 07:56:12
回答 1查看 1.4K关注 0票数 1

我有脸书登录,它使用社交名流图书馆。问题中的错误发生在回调发生时。

这是我的“用户”模型

代码语言:javascript
复制
    <?php



namespace App;

use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;

class User extends Model implements Authenticatable  

{
     //use Illuminate\Contracts\Auth\Authenticatable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];


    use \Illuminate\Auth\Authenticatable;

   public function posts()
    {

        return $this->hasMany('App\Post');
    }

    public function likes()
    {
        return $this->hasMany('App\Like');
    }



}

社交名流登录由SocialAuthController处理,我从错误中了解的是,SocialAuthController,null被传递给登录名(“NULL”)。这是SocialAuthController的代码。我在这里犯了什么错误以及如何解决这个问题。提前感谢

代码语言:javascript
复制
   <?php

namespace App\Http\Controllers;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Socialite;
use App\SocialAccountService;

class SocialAuthController extends Controller 
{

public function redirect($provider)
{
    return Socialite::driver($provider)->redirect();
}

use \Illuminate\Auth\Authenticatable;

public function callback(SocialAccountService $service , $provider)
    {
        $user = $service->createOrGetUser(Socialite::driver($provider));

        auth()->login($user);

        return redirect()->to('/home');
    }

}

下面是处理服务,如果帐户已经存在,将尝试注册用户或登录。这是SocialAccountService.php的代码

代码语言:javascript
复制
<?php

namespace App;

use Laravel\Socialite\Contracts\Provider;

class SocialAccountService
{
    public function createOrGetUser(Provider $provider)
    {

        $providerUser = $provider->user();
        $providerName = class_basename($provider); 

        $account = SocialAccount::whereProvider($providerName)
            ->whereProviderUserId($providerUser->getId())
            ->first();

        if ($account) {
            return $account->user;
        } else {

            $account = new SocialAccount([
                'provider_user_id' => $providerUser->getId(),
                'provider' => $providerName
            ]);

            $user = User::whereEmail($providerUser->getEmail())->first();

            if (!$user) {

                $user = User::create([
                    'email' => $providerUser->getEmail(),
                    'name' => $providerUser->getName(),
                ]);
            }

            $account->user()->associate($user);
            $account->save();

            return $user;

        }

    }
}

这将尝试在系统中查找提供者的帐户,如果它不存在,它将创建新用户。此方法还将尝试将社会帐户与电子邮件地址相关联,以防用户已经拥有帐户。

EN

回答 1

Stack Overflow用户

发布于 2016-06-22 09:36:41

我的猜测是createOrGetUser()返回NULL,因为SocialAccount没有用户。因此,可以做的是更改该方法中的if条件,以检查$account是否有用户:

代码语言:javascript
复制
public function createOrGetUser(Provider $provider)
{
    ...
    if ( $account && property_exists($account, 'user') && $account->user ) {
        return $account->user;
    } else {
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37961875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档