diff --git a/app/config/providers.php b/app/config/providers.php index b45ca52a7..7cfe0c944 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -61,4 +61,9 @@ return [ 'icon' => 'icon-apple', 'enabled' => false, ], + 'amazon' => [ + 'developers' => 'https://www.dropbox.com/developers/documentation', + 'icon' => 'icon-amazon', + 'enabled' => true, + ], ]; diff --git a/app/controllers/auth.php b/app/controllers/auth.php index 75d7da05f..22c4aaaca 100644 --- a/app/controllers/auth.php +++ b/app/controllers/auth.php @@ -730,6 +730,9 @@ $utopia->get('/v1/auth/oauth/:provider/redirect') $defaultState = ['success' => $project->getAttribute('url', ''), 'failure' => '']; $validateURL = new URL(); + // Uncomment this while testing amazon oAuth + $state = html_entity_decode($state); + if (!empty($state)) { try { $state = array_merge($defaultState, json_decode($state, true)); diff --git a/src/Auth/OAuth/Amazon.php b/src/Auth/OAuth/Amazon.php new file mode 100644 index 000000000..d280b0276 --- /dev/null +++ b/src/Auth/OAuth/Amazon.php @@ -0,0 +1,127 @@ +appID). + '&redirect_uri='.urlencode($this->callback). + '&response_type=code'. + '&state='.urlencode(json_encode($this->state)). + '&scope=profile'; + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + + $headers[] = 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8'; + $accessToken = $this->request( + 'POST', + 'https://api.amazon.com/auth/o2/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['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['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']; + } + + return ''; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + if (empty($this->user)) { + $user = $this->request('GET', 'https://api.amazon.com/user/profile?access_token='.urlencode($accessToken)); + $this->user = json_decode($user, true); + } + return $this->user; + } +}