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.
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']
And you could simply do:
In linkedin you can get first and last name from provider like this.
I've found that sometimes the user object won't contain the first and last names unless you specify you need those fields.
then you can get the first name and last name like this
Other stuff you can ask for:
https://developers.facebook.com/docs/graph-api/reference/user/
for google plus:
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:
The $fullName variable is:
For this implementation i assume that:
Now that you have the data in the array you can use them while creating the user:
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!