diff --git a/app/config/providers.php b/app/config/providers.php index 9a84950ac..f8c587b43 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -46,6 +46,11 @@ return [ 'icon' => 'icon-linkedin', 'enabled' => true, ], + 'slack' => [ + 'developers' => 'https://api.slack.com/', + 'icon' => 'icon-slack', + 'enabled' => true, + ], 'dropbox' => [ 'developers' => 'https://www.dropbox.com/developers/documentation', 'icon' => 'icon-dropbox', diff --git a/public/images/oauth/slack.png b/public/images/oauth/slack.png new file mode 100644 index 000000000..9de2cbc5b Binary files /dev/null and b/public/images/oauth/slack.png differ diff --git a/src/Auth/OAuth/Slack.php b/src/Auth/OAuth/Slack.php new file mode 100644 index 000000000..120dd4233 --- /dev/null +++ b/src/Auth/OAuth/Slack.php @@ -0,0 +1,129 @@ +appID). + '&scope=identity.avatar+identity.basic+identity.email+identity.team'. + '&redirect_uri='.urlencode($this->callback). + '&state='.urlencode(json_encode($this->state)); + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code):string + { + // https://api.slack.com/docs/oauth#step_3_-_exchanging_a_verification_code_for_an_access_token + $accessToken = $this->request( + 'GET', + 'https://slack.com/api/oauth.access'. + '?client_id='.urlencode($this->appID). + '&client_secret='.urlencode($this->appSecret). + '&code='.urlencode($code). + '&redirect_uri='.urlencode($this->callback) + ); + + $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['user']['id'])) { + return $user['user']['id']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['user']['email'])) { + return $user['user']['email']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken):string + { + $user = $this->getUser($accessToken); + + if (isset($user['user']['name'])) { + return $user['user']['name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken):array + { + + if (empty($this->user)) { + // https://api.slack.com/methods/users.identity + $user = $this->request( + 'GET', + 'https://slack.com/api/users.identity?token='.urlencode($accessToken), + ); + + $this->user = json_decode($user, true); + } + + return $this->user; + } +}