Laravel Socialite Google注册和登录

时间:2015-03-02 19:23:39

标签: authentication laravel-5

我正在尝试将Socialite包实现到我的项目中。这是我的代码,工作正常。但是,如果用户注销尝试重新登录,它会在数据库中重复输入。此外,我无法使用$ userData-> name获取用户的公共名称。它返回null。

这是我的控制器;

namespace App\Http\Controllers;

use App\AuthenticateUser;
use App\AuthenticateUserListener;
use App\Http\Requests;
use Illuminate\Http\Request;

class SocialLoginsController extends Controller implements 
AuthenticateUserListener
{
/**
 * @param AuthenticateUser $authenticateUser
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\RedirectResponse
 */
public function socialLogin(AuthenticateUser $authenticateUser, Request $request)
{
    $hasCode = $request->has('code');
    return $authenticateUser->execute($hasCode, $this);
}


/**
 * When a user has successfully been logged in...
 *
 * @param $user
 * @return \Illuminate\Routing\Redirector
 */
public function userHasLoggedIn($user)
{
    return redirect('student');
}

我的用户存储库;

namespace App\Repositories;
use App\User;


class UserRepository {


public function findByUsernameOrCreate($userData)
{

    return User::firstOrCreate([
        'username'  =>  $userData->name,
        'email' =>  $userData->email,

    ]);

}
}

验证用户类;

<?php namespace App;
use Illuminate\Contracts\Auth\Guard;
use App\Repositories\UserRepository;
use Laravel\Socialite\Contracts\Factory as Socialite;
class AuthenticateUser {
/**
 * @var UserRepository
 */
private $users;
/**
 * @var Socialite
 */
private $socialite;
/**
 * @var Guard
 */
private $auth;
/**
 * @param UserRepository $users
 * @param Socialite $socialite
 * @param Guard $auth
 */
public function __construct(UserRepository $users, Socialite $socialite, Guard $auth)
{
    $this->users = $users;
    $this->socialite = $socialite;
    $this->auth = $auth;
}
/**
 * @param boolean $hasCode
 * @param AuthenticateUserListener $listener
 * @return \Symfony\Component\HttpFoundation\RedirectResponse
 */
public function execute($hasCode, AuthenticateUserListener $listener)
{
    if ( ! $hasCode) return $this->getAuthorizationFirst();

    elseif($hasCode) {
        $user = $this->users->findByUsernameOrCreate($this->getGoogleUser());
        $this->auth->login($user, true);
        return $listener->userHasLoggedIn($user);
    }
}



/**
 * @return \Symfony\Component\HttpFoundation\RedirectResponse
 */
private function getAuthorizationFirst()
{
    return $this->socialite->driver('google')->redirect();
}


/**
 * @return \Laravel\Socialite\Contracts\User
 */
private function getGoogleUser()
{
    return $this->socialite->driver('google')->user();

}



}

1 个答案:

答案 0 :(得分:1)

我已经能够通过使用与此处相似的代码来完成此工作,除非我已修改findByUsernameOrCreate中的UserRepository方法。我创建了一个syncUserDetails方法,如下所示:

public function syncUserDetails($userData)
{
    if ( $user = $this->userRecordExists($userData) )
    {
        $user->token = $userData->token;
        $user->google_id = $userData->id;
        $user->name = $userData->name;
        $user->avatar = $userData->avatar;
        $user->first_name = $userData->user['name']['givenName'];
        $user->last_name = $userData->user['name']['familyName'];
        $user->save();

        return $user;
    }

    return $this->user->firstOrCreate([
        'email'      => $userData->email,
        'token'      => $userData->token,
        'google_id'  => $userData->id,
        'name'       => $userData->name,
        'avatar'     => $userData->avatar,
        'first_name' => $userData->user['name']['givenName'],
        'last_name'  => $userData->user['name']['familyName']
    ]);
}

它检查数据库中是否已存在匹配电子邮件的用户:

private function userRecordExists($userData)
{
    return $this->user->where('email', $userData->email)->first();
}

如果是,则将其与新数据匹配并返回用户。

希望这有帮助!