首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel社交名流谷歌注册和登录

Laravel社交名流谷歌注册和登录
EN

Stack Overflow用户
提问于 2015-03-02 19:23:39
回答 1查看 2.6K关注 0票数 6

我正试图在我的项目中实施社交名流计划。这是我的代码,运行良好。但是,如果用户注销尝试重新登录,则会重复数据库中的条目。而且,我不能用$userData->name获取用户的公共名称。它返回null。

这是我的控制器;

代码语言:javascript
复制
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');
}

我的用户存储库;

代码语言:javascript
复制
namespace App\Repositories;
use App\User;


class UserRepository {


public function findByUsernameOrCreate($userData)
{

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

    ]);

}
}

认证用户类;

代码语言:javascript
复制
<?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();

}



}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-17 17:00:55

我可以通过使用与这里非常相似的代码来实现这个功能,但我在您的findByUsernameOrCreate中修改了UserRepository方法。我创建了一个syncUserDetails方法,如下所示:

代码语言:javascript
复制
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']
    ]);
}

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

代码语言:javascript
复制
private function userRecordExists($userData)
{
    return $this->user->where('email', $userData->email)->first();
}

如果是这样,那么将其与新数据匹配并返回一个用户。

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28817830

复制
相关文章

相似问题

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