Email return:null Laravel Socilite - Facebook/Github

Asked

Viewed 200 times

2

I am trying to register/login a system via Facebook using the Socialite in the Laravel 5, but the problem is that the user’s email always returns as null. I also tested with the Github and the return is null. So, man app in the facebook is allowed to access the user’s email. I know that the return of the email is not guaranteed, but I am doing the tests with my account and I left my email as public to have no error, even so the return is null. I’m missing something, because at first it’s to be simple, maybe seen by other eyes or with some tips I can solve this. Besides, I’m no expert at LARAVEL.

Man Facebookcontroller

/**
 *
 */
public function login() {

    return \Socialize::with('facebook')->scopes(['email'])->redirect();

}

public function pageFacebook() {

    $user = \Socialize::with('facebook')->user();

    dd($user);
    return $user->getEmail();
}

My routes:

Route::get('loginFacebook', 'FacebookController@login');
Route::get('facebook', 'FacebookController@pageFacebook');

My return: inserir a descrição da imagem aqui

  • dd for code execution. That was there before?

  • No, I put it to show how User was returning;

1 answer

1


I was working with that too, try to use the code I’m using because I couldn’t identify the error in your:

namespace Laravel\Socialite\Two;

class FacebookProvider extends AbstractProvider implements ProviderInterface
{
    /**
     * The base Facebook Graph URL.
     *
     * @var string
     */
    protected $graphUrl = 'https://graph.facebook.com';
/**
 * The Graph API version for the request.
 *
 * @var string
 */
protected $version = 'v2.5';

/**
 * The user fields being requested.
 *
 * @var array
 */
protected $fields = ['name', 'email', 'gender', 'verified'];

/**
 * The scopes being requested.
 *
 * @var array
 */
protected $scopes = ['email'];

/**
 * Display the dialog in a popup view.
 *
 * @var bool
 */
protected $popup = false;

/**
 * {@inheritdoc}
 */
protected function getAuthUrl($state)
{
    return $this->buildAuthUrlFromBase('https://www.facebook.com/'.$this->version.'/dialog/oauth', $state);
}

/**
 * {@inheritdoc}
 */
protected function getTokenUrl()
{
    return $this->graphUrl.'/oauth/access_token';
}

/**
 * Get the access token for the given code.
 *
 * @param  string  $code
 * @return string
 */
public function getAccessToken($code)
{
    $response = $this->getHttpClient()->get($this->getTokenUrl(), [
        'query' => $this->getTokenFields($code),
    ]);

    return $this->parseAccessToken($response->getBody());
}

/**
 * {@inheritdoc}
 */
protected function parseAccessToken($body)
{
    parse_str($body);

    return $access_token;
}

/**
 * {@inheritdoc}
 */
protected function getUserByToken($token)
{
    $appSecretProof = hash_hmac('sha256', $token, $this->clientSecret);

    $response = $this->getHttpClient()->get($this->graphUrl.'/'.$this->version.'/me?access_token='.$token.'&appsecret_proof='.$appSecretProof.'&fields='.implode(',', $this->fields), [
        'headers' => [
            'Accept' => 'application/json',
        ],
    ]);

    return json_decode($response->getBody(), true);
}

/**
 * {@inheritdoc}
 */
protected function mapUserToObject(array $user)
{
    $avatarUrl = $this->graphUrl.'/'.$this->version.'/'.$user['id'].'/picture';

    return (new User)->setRaw($user)->map([
        'id' => $user['id'], 'nickname' => null, 'name' => isset($user['name']) ? $user['name'] : null,
        'email' => isset($user['email']) ? $user['email'] : null, 'avatar' => $avatarUrl.'?type=normal',
        'avatar_original' => $avatarUrl.'?width=1920',
    ]);
}

/**
 * {@inheritdoc}
 */
protected function getCodeFields($state = null)
{
    $fields = parent::getCodeFields($state);

    if ($this->popup) {
        $fields['display'] = 'popup';
    }

    return $fields;
}

/**
 * Set the user fields to request from Facebook.
 *
 * @param  array  $fields
 * @return $this
 */
public function fields(array $fields)
{
    $this->fields = $fields;

    return $this;
}

/**
 * Set the dialog to be displayed as a popup.
 *
 * @return $this
 */
public function asPopup()
{
    $this->popup = true;

    return $this;
}
  }
  • It worked out, man Facebookprovider was practically the same, so I saw the significant difference of the codes is from the function getUserByToken . I didn’t understand it very well, but it worked now.

  • Oops! Blz then =D

Browser other questions tagged

You are not signed in. Login or sign up in order to post.