diff --git a/app/Helpers/Mail/GmailTransport.php b/app/Helpers/Mail/GmailTransport.php index 722c8c755e8c..e1c600abe5a4 100644 --- a/app/Helpers/Mail/GmailTransport.php +++ b/app/Helpers/Mail/GmailTransport.php @@ -49,6 +49,8 @@ class GmailTransport extends Transport public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) { + /*We should nest the token in the message and then discard it as needed*/ + $this->beforeSendPerformed($message); $this->gmail->using($this->token); diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 4afc0e7c6ae7..dc85e4d52a2f 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -257,7 +257,7 @@ class LoginController extends BaseController if (request()->has('code')) { return $this->handleProviderCallback($provider); } else { - return Socialite::driver($provider)->scopes('https://www.googleapis.com/auth/gmail.send')->redirect(); + return Socialite::driver($provider)->scopes(['https://www.googleapis.com/auth/gmail.send','email','profile','openid'])->redirect(); } } @@ -269,7 +269,7 @@ class LoginController extends BaseController if (request()->has('code')) { return $this->handleProviderCallbackAndCreate($provider); } else { - return Socialite::driver($provider)->scopes('https://www.googleapis.com/auth/gmail.send')->redirectUrl($redirect_url)->redirect(); + return Socialite::driver($provider)->scopes(['https://www.googleapis.com/auth/gmail.send','email','profile','openid'])->redirectUrl($redirect_url)->redirect(); } } @@ -386,19 +386,119 @@ class LoginController extends BaseController * return User $user */ public function oauthApiLogin() + { + + if(request()->input('provider') == 'google') + return $this->handleGoogleOauth(); + +// $user = false; + +// $oauth = new OAuth(); + +// $user = $oauth->getProvider(request()->input('provider'))->getTokenResponse(request()->input('id_token')); + +// // server_auth_code +// // access_token +// // id_token + +// if ($user = OAuth::handleAuth($socialite_user, $provider)) { +// $user->oauth_user_token = $socialite_user->token; +// $user->save(); +// Auth::login($user, true); + +// return redirect($this->redirectTo); +// } elseif (MultiDB::checkUserEmailExists($socialite_user->getEmail())) { +// Session::flash('error', 'User exists in system, but not with this authentication method'); //todo add translations + +// return view('auth.login'); +// } +// * 3. Automagically creating a new account here. +// else { +// //todo +// $name = OAuth::splitName($socialite_user->getName()); + +// $new_account = [ +// 'first_name' => $name[0], +// 'last_name' => $name[1], +// 'password' => '', +// 'email' => $socialite_user->getEmail(), +// 'oauth_user_id' => $socialite_user->getId(), +// 'oauth_user_token' => $socialite_user->token, +// 'oauth_provider_id' => $provider +// ]; + +// $account = CreateAccount::dispatchNow($new_account); + +// Auth::login($account->default_company->owner(), true); + +// $cookie = cookie('db', $account->default_company->db); + +// return redirect($this->redirectTo)->withCookie($cookie); +// } + + // if ($user) { + // $ct = CompanyUser::whereUserId($user); + // return $this->listResponse($ct); + // // return $this->itemResponse($user); + // } else { + // return $this->errorResponse(['message' => 'Invalid credentials'], 401); + // } + } + + private function handleGoogleOauth() { $user = false; $oauth = new OAuth(); - $user = $oauth->getProvider(request()->input('provider'))->getTokenResponse(request()->input('token')); + $user = $oauth->getProvider(request()->input('provider'))->getTokenResponse(request()->input('id_token')); - if ($user) { - $ct = CompanyUser::whereUserId($user); - return $this->listResponse($ct); - // return $this->itemResponse($user); - } else { - return $this->errorResponse(['message' => 'Invalid credentials'], 401); + if(is_array($user)) + { + $query = [ + 'oauth_user_id' =>$oauth->getProvider(request()->input('provider'))->harvestSubField($user), + 'oauth_provider_id'=>$provider + ]; + + if ($user = MultiDB::hasUser($query)) + { + + Auth::login($user, true); + + $ct = CompanyUser::whereUserId(auth()->user()->id); + return $this->listResponse($ct); + + } } + else if($user && request()->input('create') == 'true') { + +//server_auth_code + $client = new \Google_Client(); + $accessToken = $client->fetchAccessTokenWithAuthCode(request()->input('server_auth_code')); + $refresh_token = $client->getRefreshToken(); + + $name = OAuth::splitName($oauth->getProvider(request()->input('provider'))->harvestName($user)); + + $new_account = [ + 'first_name' => $name[0], + 'last_name' => $name[1], + 'password' => '', + 'email' => $oauth->getProvider(request()->input('provider'))->harvestEmail($user), + 'oauth_user_id' => $oauth->getProvider(request()->input('provider'))->harvestSubField($user), + 'oauth_user_token' => request()->input('access_token'), + 'oauth_user_refresh_token' => $refresh_token, + 'oauth_provider_id' => $provider + ]; + + MultiDB::setDefaultDatabase(); + + $account = CreateAccount::dispatchNow($new_account); + + Auth::login($account->default_company->owner(), true); + $ct = CompanyUser::whereUserId(auth()->user()->id); + return $this->listResponse($ct); + } + } + } diff --git a/app/Libraries/OAuth.php b/app/Libraries/OAuth.php deleted file mode 100644 index c2d977452812..000000000000 --- a/app/Libraries/OAuth.php +++ /dev/null @@ -1,137 +0,0 @@ -$user->getId(), - 'oauth_provider_id'=>$provider - ]; - - if ($user = MultiDB::hasUser($query)) { - return $user; - } else { - return false; - } - } - - /* Splits a socialite user name into first and last names */ - public static function splitName($name) - { - $name = trim($name); - $last_name = (strpos($name, ' ') === false) ? '' : preg_replace('#.*\s([\w-]*)$#', '$1', $name); - $first_name = trim(preg_replace('#' . preg_quote($last_name, '/') . '#', '', $name)); - - return [$first_name, $last_name]; - } - - public static function providerToString(int $social_provider) : string - { - switch ($social_provider) { - case SOCIAL_GOOGLE: - return 'google'; - case SOCIAL_FACEBOOK: - return 'facebook'; - case SOCIAL_GITHUB: - return 'github'; - case SOCIAL_LINKEDIN: - return 'linkedin'; - case SOCIAL_TWITTER: - return 'twitter'; - case SOCIAL_BITBUCKET: - return 'bitbucket'; - } - } - - public static function providerToInt(string $social_provider) : int - { - switch ($social_provider) { - case 'google': - return SOCIAL_GOOGLE; - case 'facebook': - return SOCIAL_FACEBOOK; - case 'github': - return SOCIAL_GITHUB; - case 'linkedin': - return SOCIAL_LINKEDIN; - case 'twitter': - return SOCIAL_TWITTER; - case 'bitbucket': - return SOCIAL_BITBUCKET; - } - } - - public function getProvider($provider) - { - switch ($provider) { - case 'google': - $this->provider_instance = new Providers\Google(); - $this->provider_id = self::SOCIAL_GOOGLE; - return $this; - - default: - return null; - break; - } - } - - public function getTokenResponse($token) - { - $user = false; - - $payload = $this->provider_instance->getTokenResponse($token); - - $oauth_user_id = $this->provider_instance->harvestSubField($payload); - - $query = [ - 'oauth_user_id' => $oauth_user_id, - 'oauth_provider_id'=> $this->provider_id - ]; - - if ($user = MultiDB::hasUser($query)) { - return $user; - } else { - return false; - } - } -} diff --git a/app/Libraries/OAuth/Providers/Google.php b/app/Libraries/OAuth/Providers/Google.php index d84c1290cc0c..1bf03ecc4ca7 100644 --- a/app/Libraries/OAuth/Providers/Google.php +++ b/app/Libraries/OAuth/Providers/Google.php @@ -19,4 +19,10 @@ class Google implements ProviderInterface { return $payload['sub']; // user ID } + + public function havestName($payload) + { + return $payload['name']; + } + } diff --git a/app/Libraries/OAuth/Providers/ProviderInterface.php b/app/Libraries/OAuth/Providers/ProviderInterface.php index 4cbc21ad474d..5744b53a8912 100644 --- a/app/Libraries/OAuth/Providers/ProviderInterface.php +++ b/app/Libraries/OAuth/Providers/ProviderInterface.php @@ -7,4 +7,6 @@ interface ProviderInterface public function getTokenResponse($token); public function harvestEmail($response); + + public function havestName($response); } diff --git a/database/migrations/2020_05_13_035355_add_google_refresh_token_to_users_table.php b/database/migrations/2020_05_13_035355_add_google_refresh_token_to_users_table.php new file mode 100644 index 000000000000..18367713a90d --- /dev/null +++ b/database/migrations/2020_05_13_035355_add_google_refresh_token_to_users_table.php @@ -0,0 +1,30 @@ +string('oauth_user_refresh_token')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +}