From 358f6bdf6bb5d4701f6e7f57bf87a7aee43495c7 Mon Sep 17 00:00:00 2001 From: Armino Popp Date: Wed, 15 Jan 2020 17:50:22 +0200 Subject: [PATCH] Added twitch OAuth --- app/config/providers.php | 6 ++ public/images/oauth/twitch.png | Bin 0 -> 3793 bytes src/Auth/OAuth/Twitch.php | 145 +++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 public/images/oauth/twitch.png create mode 100644 src/Auth/OAuth/Twitch.php diff --git a/app/config/providers.php b/app/config/providers.php index a2a8f2f19..061bbd9d8 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -91,6 +91,12 @@ return [ 'enabled' => true, 'mock' => false, ], + 'twitch' => [ + 'developers' => 'https://dev.twitch.tv/docs/authentication', + 'icon' => 'icon-twitch', + 'enabled' => true, + 'mock' => false, + ], // Keep Last 'mock' => [ 'developers' => 'https://appwrite.io', diff --git a/public/images/oauth/twitch.png b/public/images/oauth/twitch.png new file mode 100644 index 0000000000000000000000000000000000000000..e90f548e4b5ccefc3665ee5d1e822f22c6f2c84f GIT binary patch literal 3793 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 Hu0mjf2pmB) literal 0 HcmV?d00001 diff --git a/src/Auth/OAuth/Twitch.php b/src/Auth/OAuth/Twitch.php new file mode 100644 index 000000000..6299668c2 --- /dev/null +++ b/src/Auth/OAuth/Twitch.php @@ -0,0 +1,145 @@ +endpoint . '/oauth2/authorize?'. + http_build_query([ + 'response_type' => 'code', + 'client_id' => $this->appID, + 'scope' => implode(' ', $this->scope), + 'redirect_uri' => $this->callback, + 'state' => $this->state, + ]); + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code):string + { + $accessToken = $this->request( + 'POST', + $this->endpoint . '/oauth2/token?', + [], + http_build_query([ + 'grant_type' => 'authorization_code', + 'code' => $code, + 'redirect_uri' => $this->callback, + 'client_id' => $this->appID, + 'client_secret' => $this->appSecret, + ]) + ); + + $accessToken = json_decode($accessToken, true); + + if (isset($output['access_token'])) { + return $output['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 + { + $emails = json_decode($this->request('GET', $this->endpoint . '/userinfo', ['Authorization: Bearer '.urlencode($accessToken)]), true); + + foreach ($emails as $email) { + if ($email['primary'] && $email['verified']) { + return $email['email']; + } + } + + return ''; + } + + /** + * @param $accessToken + * + * @return string + */ + public function getUserName(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['name'])) { + return $user['name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken) + { + if (empty($this->user)) { + $this->user = json_decode($this->request('GET', $this->endpoint . '/userinfo', ['Authorization: Bearer '.urlencode($accessToken)]), true); + } + + return $this->user; + } +}