Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel Socialite: Legacy People API has not been used in project

I have used Laravel 5.4 with socialite 3.0 for social login on my web application. But nowadays I got an error Legacy People API has not been used in project xxx. Then I have made some changes in a core file of socialite package. /vendor/laravel/socialite/src/Two/GoogleProvider.php Line 61: Replace https://www.googleapis.com/plus/v1/people/me? by https://www.googleapis.com/oauth2/v3/userinfo?

And update mapUserToObject function with below code:

protected function mapUserToObject(array $user)
{
    $user['id'] = Arr::get($user, 'sub');
    $user['verified_email'] = Arr::get($user, 'email_verified');
    $user['link'] = Arr::get($user, 'profile');

    return (new User)->setRaw($user)->map([
        'id' => Arr::get($user, 'sub'),
        'nickname' => Arr::get($user, 'nickname'),
        'name' => Arr::get($user, 'name'),
        'email' => Arr::get($user, 'email'),
        'avatar' => $avatarUrl = Arr::get($user, 'picture'),
        'avatar_original' => $avatarUrl,
    ]);
}
like image 968
Vineet Chauhan Avatar asked Nov 05 '19 07:11

Vineet Chauhan


Video Answer


2 Answers

This Solution does work. Fixed my issue.

Thanks a lot.

Here is the whole file if anybody is having this issue. Just change GoogleProvider class located in: ./vendor/laravel/socialite/src/Two/GoogleProvider.php with this:

class GoogleProvider extends AbstractProvider implements ProviderInterface{

protected $scopeSeparator = ' ';

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

/**
 * {@inheritdoc}
 */
protected function getAuthUrl($state)
{
    return $this->buildAuthUrlFromBase('https://accounts.google.com/o/oauth2/auth', $state);
}

/**
 * {@inheritdoc}
 */
protected function getTokenUrl()
{
    return 'https://accounts.google.com/o/oauth2/token';
}

/**
 * Get the POST fields for the token request.
 *
 * @param  string  $code
 * @return array
 */
protected function getTokenFields($code)
{
    return array_add(
        parent::getTokenFields($code), 'grant_type', 'authorization_code'
    );
}

/**
 * {@inheritdoc}
 */
protected function getUserByToken($token)
{
    //fixing legacy google+ api
    $response = $this->getHttpClient()->get('https://www.googleapis.com/oauth2/v3/userinfo?', [
        'query' => [
            'prettyPrint' => 'false',
        ],
        'headers' => [
            'Accept' => 'application/json',
            'Authorization' => 'Bearer '.$token,
        ],
    ]);
    return json_decode($response->getBody(), true);
}

/**
 * {@inheritdoc}
 */
protected function mapUserToObject(array $user)
{
    //fixing legacy google+ api
    $user['id'] = Arr::get($user, 'sub');
    $user['verified_email'] = Arr::get($user, 'email_verified');
    $user['link'] = Arr::get($user, 'profile');

    $avatarUrl = Arr::get($user, 'image.url');
    return (new User)->setRaw($user)->map([
        'id' => Arr::get($user, 'sub'),
        'nickname' => Arr::get($user, 'nickname'),
        'name' => Arr::get($user, 'name'),
        'email' => Arr::get($user, 'email'),
        'avatar' => $avatarUrl = Arr::get($user, 'picture'),
        'avatar_original' => $avatarUrl,
    ]);

}

}

like image 159
Amir Khalil Avatar answered Sep 29 '22 15:09

Amir Khalil


Replace

https://www.googleapis.com/plus/v1/people/me? url with https://www.googleapis.com/oauth2/v3/userinfo?

Google has update the API Endpoint & it recommend to use this https://www.googleapis.com/oauth2/v3/userinfo? endpoint to get the user details.

https://developers.google.com/people/legacy

like image 21
symi khan Avatar answered Sep 29 '22 15:09

symi khan