Laravel Socialite first and last name

2019-05-04 09:41发布

I'm adding social authentication to an application using Laravel's Socialite. I can retrieve the full name but not the first and last names separately. After the callback happens and Socialite is handling it, the user is retrieved successfully. If I am to dump the user I get back from $user = this->social->driver('facebook')->user(); I get the following:

object(Laravel\Socialite\Two\User)#459 (8) {
     ["token" ]=> string(209) "{token}"
     ["id"] => string(17) "{socialID}"
     ["nickname"] => NULL
     ["name"] => string(14) "{Full Name}"
     ["email"] => string(19) "{Email address}"
     ["avatar"] => string(69) "https://graph.facebook.com/v2.4/{socialID}/picture?type=normal"
     ["user"] => array(6) {
        ["first_name"] => string(6) "{First name}"
        ["last_name"] => string(7) "{Last mame}"
        ["email"] => string(19) "{Email address}"
        ["gender"] => string(4) "male"
        ["verified"] => bool(true)
        ["id"] => string(17) "{socialID}"
    }
    ["avatar_original"] => string(68) "https://graph.facebook.com/v2.4/{socialID}/picture?width=1920"

}

I can obtain the full name or email via $user->name or $user->email however, I can not get the separate first and last names. I have tried $user->first_name as well as trying to dump the $user->user array but all I see is undefined property errors.

I do not want to do something weird like extract it from the full name when the separate first and last name are clearly there as it can get ugly when middle names are present.

I have Googled my way around and weirdly, nobody came across this issue. Am I missing something from the docs? Any suggestions on how to retrieve the first and last name from the user array are greatly appreciated.

5条回答
我只想做你的唯一
2楼-- · 2019-05-04 09:54

According to the dump of the $user var you should be able to access the name values by doing:

$user->user['first_name'] and $user->user['last_name']

查看更多
一夜七次
3楼-- · 2019-05-04 09:58

And you could simply do:

$NameArray = explode(' ',$user->getName());
$First_name = $NameArray[0];
$Last_name = $NameArray[1];
查看更多
萌系小妹纸
4楼-- · 2019-05-04 10:08

In linkedin you can get first and last name from provider like this.

$linkedinUser = $this->socialite->driver('linkedin')->user());

$attributes = [
        'first_name' => $linkedinUser->user['firstName'],
        'last_name' => $linkedinUser->user['lastName'],
        'email' => $linkedinUser->email,
        'avatar' => $linkedinUser->avatar,
        'linkedin_id' => $linkedinUser->id
    ];
查看更多
啃猪蹄的小仙女
5楼-- · 2019-05-04 10:12

I've found that sometimes the user object won't contain the first and last names unless you specify you need those fields.

//get the driver and set desired fields
$driver = Socialite::driver('facebook')
                ->fields([
                    'name', 
                    'first_name', 
                    'last_name', 
                    'email', 
                    'gender', 
                    'verified'
                ]);
// retrieve the user
$user = $driver->user();

then you can get the first name and last name like this

$user->user['first_name'] and $user->user['last_name']

Other stuff you can ask for:

https://developers.facebook.com/docs/graph-api/reference/user/

for google plus:

$user->firstname = $user->user['name']['givenName'];
$user->lastname = $user->user['name']['familyName'];
查看更多
神经病院院长
6楼-- · 2019-05-04 10:18

After coming against the same issue myself, i noticed that all social networks i used for registration/login (Facebook, Twitter, Google+, Github) send back a "name" attribute. This attribute can either be empty (if the user hasn't added any information) or carry a value.

What i did, was to create a method (getFirstLastNames()) that will get that "name" value and break it into first_name and last_name by exploding them when a space or multiple spaces is detected. Then i use them to populate my users table:

protected function getFirstLastNames($fullName)
{
    $parts = array_values(array_filter(explode(" ", $fullName)));

    $size = count($parts);

    if(empty($parts)){
        $result['first_name']   = NULL;
        $result['last_name']    = NULL;
    }

    if(!empty($parts) && $size == 1){
        $result['first_name']   = $parts[0];
        $result['last_name']    = NULL;
    }

    if(!empty($parts) && $size >= 2){
        $result['first_name']   = $parts[0];
        $result['last_name']    = $parts[1];
    }

    return $result;
}

The $fullName variable is:

Socialite::driver($provider)->getName();

For this implementation i assume that:

  1. No matter how many names the user has, i will use the first part of the string as the first_name and the second one as the last_name. [if my name is POPPY PETAL EMMA ELIZABETH DEVERAUX, then i will use POPPY as first_name and PETAL as last_name. The rest will be ignored]. If the "name" attribute comes back empty or with one name, then i insert NULL into the users table where i get no value.
  2. If the user has used multiple spaces while separating the names (or before and after the names), this method will remove them and keep only the strings.

Now that you have the data in the array you can use them while creating the user:

$userFirstLastName = $this->getFirstLastNames(Socialite::driver($provider)->getName());

$user = User::create([
            'email'         => Socialite::driver($provider)->getName()->getEmail(),
            'first_name'    => $userFirstLastName['first_name'],
            'last_name'     => $userFirstLastName['last_name'],
        ]);

ps1: Make sure you change the migrations for users table (Laravel 5.3 uses only "name" field. If you need to have the "first_name" and "last_name" you should change it. Of course run "php artisan migrate:refresh" to implement the changes. All data will be lost.

ps2: Make sure the first_name, last_name and password fields can be nullable. Otherwise you will get an error.

ps3: Inside User model, add first_name and last_name and remove name in the $fillable property.

ps4: [Not Playstation 4] The first_name and last_name values can be altered by the user within your web app, if the above procedure used your second name as first_name or last_name. You can't predict what each user uses as a full name, so you need to make assumptions.

Hope this helps!

查看更多
登录 后发表回答