building-sign/vendor/overtrue/socialite/src/Providers/GitHub.php

98 lines
2.4 KiB
PHP
Executable File

<?php
namespace Overtrue\Socialite\Providers;
use Overtrue\Socialite\User;
class GitHub extends Base
{
public const NAME = 'github';
protected array $scopes = ['read:user'];
protected string $scopeSeparator = ' ';
protected function getAuthUrl(): string
{
return $this->buildAuthUrlFromBase('https://github.com/login/oauth/authorize');
}
protected function getTokenUrl(): string
{
return 'https://github.com/login/oauth/access_token';
}
/**
* @param string $token
*
* @return array
* @throws \GuzzleHttp\Exception\GuzzleException
*/
protected function getUserByToken(string $token): array
{
$userUrl = 'https://api.github.com/user';
$response = $this->getHttpClient()->get(
$userUrl,
$this->createAuthorizationHeaders($token)
);
$user = json_decode($response->getBody(), true);
if (in_array('user:email', $this->scopes)) {
$user['email'] = $this->getEmailByToken($token);
}
return $user;
}
/**
* @param string $token
*
* @return string
*/
protected function getEmailByToken(string $token)
{
$emailsUrl = 'https://api.github.com/user/emails';
try {
$response = $this->getHttpClient()->get(
$emailsUrl,
$this->createAuthorizationHeaders($token)
);
} catch (\Throwable $e) {
return '';
}
foreach (json_decode($response->getBody(), true) as $email) {
if ($email['primary'] && $email['verified']) {
return $email['email'];
}
}
}
protected function mapUserToObject(array $user): User
{
return new User([
'id' => $user['id'] ?? null,
'nickname' => $user['login'] ?? null,
'name' => $user['name'] ?? null,
'email' => $user['email'] ?? null,
'avatar' => $user['avatar_url'] ?? null,
]);
}
/**
* @param string $token
*
* @return array
*/
protected function createAuthorizationHeaders(string $token)
{
return [
'headers' => [
'Accept' => 'application/vnd.github.v3+json',
'Authorization' => sprintf('token %s', $token),
],
];
}
}