<?php /* * This file is part of the overtrue/socialite. * * (c) overtrue <i@overtrue.me> * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Overtrue\Socialite\Providers; use GuzzleHttp\ClientInterface; use Overtrue\Socialite\AccessTokenInterface; use Overtrue\Socialite\ProviderInterface; use Overtrue\Socialite\User; /** * Class GoogleProvider. * * @see https://developers.google.com/identity/protocols/OpenIDConnect [OpenID Connect] */ class GoogleProvider extends AbstractProvider implements ProviderInterface { /** * The separating character for the requested scopes. * * @var string */ protected $scopeSeparator = ' '; /** * The scopes being requested. * * @var array */ protected $scopes = [ 'https://www.googleapis.com/auth/plus.me', 'https://www.googleapis.com/auth/plus.login', 'https://www.googleapis.com/auth/plus.profile.emails.read', ]; /** * {@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 access token for the given code. * * @param string $code * * @return string */ public function getAccessToken($code) { $postKey = (version_compare(ClientInterface::VERSION, '6') === 1) ? 'form_params' : 'body'; $response = $this->getHttpClient()->post($this->getTokenUrl(), [ $postKey => $this->getTokenFields($code), ]); return $this->parseAccessToken($response->getBody()); } /** * Get the POST fields for the token request. * * @param string $code * * @return array */ protected function getTokenFields($code) { return parent::getTokenFields($code) + ['grant_type' => 'authorization_code']; } /** * {@inheritdoc} */ protected function getUserByToken(AccessTokenInterface $token) { $response = $this->getHttpClient()->get('https://www.googleapis.com/plus/v1/people/me?', [ 'query' => [ 'prettyPrint' => 'false', ], 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$token->getToken(), ], ]); return json_decode($response->getBody(), true); } /** * {@inheritdoc} */ protected function mapUserToObject(array $user) { return new User([ 'id' => $this->arrayItem($user, 'id'), 'username' => $this->arrayItem($user, 'emails.0.value'), 'nickname' => $this->arrayItem($user, 'nickname'), 'name' => $this->arrayItem($user, 'displayName'), 'email' => $this->arrayItem($user, 'emails.0.value'), 'avatar' => $this->arrayItem($user, 'image.url'), ]); } }