From 4d548d2808222ce6ff105b340a73ffe98d1728f8 Mon Sep 17 00:00:00 2001 From: Armino Popp Date: Mon, 13 Jan 2020 17:30:10 +0200 Subject: [PATCH] Added Discord OAuth provider --- app/config/providers.php | 6 +- public/images/oauth/discord.png | Bin 0 -> 5930 bytes src/Auth/OAuth/Discord.php | 150 ++++++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 public/images/oauth/discord.png create mode 100644 src/Auth/OAuth/Discord.php diff --git a/app/config/providers.php b/app/config/providers.php index 85d2326d5..d1d34630f 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -85,7 +85,11 @@ return [ 'enabled' => true, 'mock' => false, ], - + 'discord' => [ + 'developers' => 'https://discordapp.com/developers/docs/topics/oauth2', + 'icon' => 'icon-discord', + 'enabled' => true, + ], // Keep Last 'mock' => [ 'developers' => 'https://appwrite.io', diff --git a/public/images/oauth/discord.png b/public/images/oauth/discord.png new file mode 100644 index 0000000000000000000000000000000000000000..08687e91ddadf8cbf4d209b0b5f173ae092f9154 GIT binary patch literal 5930 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 JH7fQI{{x$(EkpnS literal 0 HcmV?d00001 diff --git a/src/Auth/OAuth/Discord.php b/src/Auth/OAuth/Discord.php new file mode 100644 index 000000000..b23653e99 --- /dev/null +++ b/src/Auth/OAuth/Discord.php @@ -0,0 +1,150 @@ +endpoint . '/oauth2/authorize?'. + http_build_query([ + 'response_type' => 'code', + 'client_id' => $this->appID, + 'scope' => implode(' ', $this->scope), + 'redirect_uri' => $this->callback + ]); + + return $url; + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + $accessToken = $this->request( + 'POST', + $this->endpoint . '/oauth2/token', + ['Content-Type: application/x-www-form-urlencoded'], + http_build_query([ + 'grant_type' => 'authorization_code', + 'code' => $code, + 'redirect_uri' => $this->callback, + 'client_id' => $this->appID, + 'client_secret' => $this->appSecret, + 'scope' => implode(' ', $this->scope) + ]) + ); + + + $accessToken = json_decode($accessToken, true); + + + if (isset($accessToken['access_token'])) { + return $accessToken['access_token']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['id'])) { + return $user['id']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['email'])) { + return $user['email']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['username'])) { + return $user['username']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + if (empty($this->user)) { + $user = $this->request( + 'GET', + $this->endpoint . '/users/@me', + ['Authorization: Bearer '.urlencode($accessToken)] + ); + $this->user = json_decode($user, true); + } + + return $this->user; + } +}