diff --git a/app/config/providers.php b/app/config/providers.php index 01b7b6b42..9a84950ac 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -34,7 +34,7 @@ return [ 'microsoft' => [ 'developers' => 'https://developer.microsoft.com/en-us/', 'icon' => 'icon-windows', - 'enabled' => false, + 'enabled' => true, ], 'twitter' => [ 'developers' => 'https://developer.twitter.com/', @@ -46,4 +46,9 @@ return [ 'icon' => 'icon-linkedin', 'enabled' => true, ], + 'dropbox' => [ + 'developers' => 'https://www.dropbox.com/developers/documentation', + 'icon' => 'icon-dropbox', + 'enabled' => true, + ], ]; diff --git a/public/images/oauth/dropbox.png b/public/images/oauth/dropbox.png new file mode 100644 index 000000000..20df74c10 Binary files /dev/null and b/public/images/oauth/dropbox.png differ diff --git a/public/images/oauth/microsoft.png b/public/images/oauth/microsoft.png new file mode 100644 index 000000000..9e40f2342 Binary files /dev/null and b/public/images/oauth/microsoft.png differ diff --git a/src/Auth/OAuth/Dropbox.php b/src/Auth/OAuth/Dropbox.php new file mode 100644 index 000000000..a4a6335f3 --- /dev/null +++ b/src/Auth/OAuth/Dropbox.php @@ -0,0 +1,128 @@ +appID). + '&redirect_uri='.urlencode($this->callback). + '&state='.urlencode(json_encode($this->state)). + '&response_type=code'; + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + $headers[] = 'Content-Type: application/x-www-form-urlencoded'; + $accessToken = $this->request( + 'POST', + 'https://api.dropboxapi.com/oauth2/token', + $headers, + 'code='.urlencode($code). + '&client_id='.urlencode($this->appID). + '&client_secret='.urlencode($this->appSecret). + '&redirect_uri='.urlencode($this->callback). + '&grant_type=authorization_code' + ); + + $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['account_id'])) { + return $user['account_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['name'])) { + return $user['name']['display_name']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + if (empty($this->user)) { + $headers[] = 'Authorization: Bearer '. urlencode($accessToken); + $user = $this->request('POST', 'https://api.dropboxapi.com/2/users/get_current_account', $headers); + $this->user = json_decode($user, true); + } + + return $this->user; + } +} diff --git a/src/Auth/OAuth/Microsoft.php b/src/Auth/OAuth/Microsoft.php new file mode 100644 index 000000000..6bbf0bad8 --- /dev/null +++ b/src/Auth/OAuth/Microsoft.php @@ -0,0 +1,132 @@ +appID). + '&redirect_uri='.urlencode($this->callback). + '&state='.urlencode(json_encode($this->state)). + '&scope=offline_access+user.read'. + '&response_type=code'. + '&response_mode=query'; + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + $headers[] = 'Content-Type: application/x-www-form-urlencoded'; + + $accessToken = $this->request( + 'POST', + 'https://login.microsoftonline.com/common/oauth2/v2.0/token', + $headers, + 'code='.urlencode($code). + '&client_id='.urlencode($this->appID). + '&client_secret='.urlencode($this->appSecret). + '&redirect_uri='.urlencode($this->callback). + '&scope=offline_access+user.read'. + '&grant_type=authorization_code' + ); + + $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['userPrincipalName'])) { + return $user['userPrincipalName']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + if (isset($user['displayName'])) { + return $user['displayName']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + if (empty($this->user)) { + $headers[] = 'Authorization: Bearer '. urlencode($accessToken); + $user = $this->request('GET', 'https://graph.microsoft.com/v1.0/me', $headers); + $this->user = json_decode($user, true); + } + + return $this->user; + } +}