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), ], ]; } }