From 5bfd1e602a55ff1db12d2747efc0e7762e322ab4 Mon Sep 17 00:00:00 2001 From: Armino Popp Date: Thu, 16 Jan 2020 12:48:05 +0200 Subject: [PATCH] Added Spotify OAuth provider initial files --- app/config/providers.php | 6 ++ public/images/oauth/spotify.png | Bin 0 -> 2811 bytes src/Auth/OAuth/Spotify.php | 146 ++++++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 public/images/oauth/spotify.png create mode 100644 src/Auth/OAuth/Spotify.php diff --git a/app/config/providers.php b/app/config/providers.php index 061bbd9d8..866d56393 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -97,6 +97,12 @@ return [ 'enabled' => true, 'mock' => false, ], + 'spotify' => [ + 'developers' => 'https://developer.spotify.com/documentation/general/guides/authorization-guide/', + 'icon' => 'icon-spotify', + 'enabled' => true, + 'mock' => false, + ], // Keep Last 'mock' => [ 'developers' => 'https://appwrite.io', diff --git a/public/images/oauth/spotify.png b/public/images/oauth/spotify.png new file mode 100644 index 0000000000000000000000000000000000000000..ad7f689d60eec8267ba419708e9543030e56221f GIT binary patch literal 2811 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 DePS&y literal 0 HcmV?d00001 diff --git a/src/Auth/OAuth/Spotify.php b/src/Auth/OAuth/Spotify.php new file mode 100644 index 000000000..44854fbb4 --- /dev/null +++ b/src/Auth/OAuth/Spotify.php @@ -0,0 +1,146 @@ +endpoint . 'authorize?'. + http_build_query([ + 'response_type' => 'code', + 'client_id' => $this->appID, + 'scope' => implode(' ', $this->scope), + 'redirect_uri' => $this->callback, + 'state' => json_encode($this->state) + ]); + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code):string + { + $header = "Authorization: Basic " . base64_encode($this->appID . ":" . $this->appSecret); + $result = json_decode($this->request( + 'POST', + $this->endpoint . 'api/token', + [$header], + http_build_query([ + "code" => $code, + "grant_type" => "authorization_code", + "redirect_uri" => $this->callback + ]) + ), true); + + if (isset($result['access_token'])) { + return $result['access_token']; + } + + return ''; + } + + /** + * @param $accessToken + * + * @return string + */ + public function getUserID(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['id'])) { + return $user['id']; + } + + return ''; + } + + /** + * @param $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['email'])) { + return $user['email']; + } + + return ''; + } + + /** + * @param $accessToken + * + * @return string + */ + public function getUserName(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['display_name'])) { + return $user['display_name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken) + { + if (empty($this->user)) { + $this->user = json_decode($this->request('GET', + $this->resourceEndpoint, ['Authorization: Bearer '.urlencode($accessToken)]), true); + } + + return $this->user; + } +}