From 2e724524f436f145ff6a109bbacaa8687f5c1d36 Mon Sep 17 00:00:00 2001 From: Armino Popp Date: Tue, 21 Jan 2020 22:10:11 +0200 Subject: [PATCH 1/2] Initial commit for Bitly OAuth provider --- app/config/providers.php | 6 ++++++ public/images/oauth/bitly.png | 0 src/Auth/OAuth/Bitly.php | 0 3 files changed, 6 insertions(+) create mode 100644 public/images/oauth/bitly.png create mode 100644 src/Auth/OAuth/Bitly.php diff --git a/app/config/providers.php b/app/config/providers.php index 863d880d69..703bbef264 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -133,6 +133,12 @@ return [ 'enabled' => true, 'mock' => false ], + 'bitly' => [ + 'developers' => 'https://dev.bitly.com/v4_documentation.html', + 'icon' => 'icon-bitly', + 'enabled' => true, + 'mock' => false + ], // Keep Last 'mock' => [ 'developers' => 'https://appwrite.io', diff --git a/public/images/oauth/bitly.png b/public/images/oauth/bitly.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Auth/OAuth/Bitly.php b/src/Auth/OAuth/Bitly.php new file mode 100644 index 0000000000..e69de29bb2 From c28aa3dfe0e99c36862fe62b64768aacbe22203c Mon Sep 17 00:00:00 2001 From: Armino Popp Date: Tue, 21 Jan 2020 22:59:44 +0200 Subject: [PATCH 2/2] Added Bitly OAuth provider --- public/images/oauth/bitly.png | Bin 0 -> 4760 bytes src/Auth/OAuth/Bitly.php | 151 ++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) diff --git a/public/images/oauth/bitly.png b/public/images/oauth/bitly.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..93da78b8db84eeecff8ca503ee0f596603737e45 100644 GIT binary patch literal 4760 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 . 'authorize?'. + http_build_query([ + 'client_id' => $this->appID, + 'redirect_uri' => $this->callback, + 'state' => json_encode($this->state) + ]); + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code):string + { + $response = $this->request( + 'POST', + $this->resourceEndpoint . 'oauth/access_token', + ["Content-Type: application/x-www-form-urlencoded"], + http_build_query([ + "client_id" => $this->appID, + "client_secret" => $this->appSecret, + "code" => $code, + "redirect_uri" => $this->callback, + "state" => json_encode($this->state) + ]) + ); + + $result = null; + + if ($response) { + parse_str($response, $result); + return $result['access_token']; + } + + return ''; + } + + /** + * @param $accessToken + * + * @return string + */ + public function getUserID(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['login'])) { + return $user['login']; + } + + return ''; + } + + /** + * @param $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['emails'])) { + return $user['emails'][0]['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) + { + $headers = [ + 'Authorization: Bearer '. urlencode($accessToken), + "Accept: application/json" + ]; + + if (empty($this->user)) { + $this->user = json_decode($this->request('GET', $this->resourceEndpoint . "v4/user", $headers), true); + } + + + return $this->user; + } +}