mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-11 05:32:39 +01:00
ba75a44eb8
* Adopt Laravel coding style The Laravel framework adopts the PSR-2 coding style with some additions. Laravel apps *should* adopt this coding style as well. However, Shift allows you to customize the adopted coding style by adding your own [PHP CS Fixer][1] `.php_cs` config to your project. You may use [Shift's .php_cs][2] file as a base. [1]: https://github.com/FriendsOfPHP/PHP-CS-Fixer [2]: https://gist.github.com/laravel-shift/cab527923ed2a109dda047b97d53c200 * Shift bindings PHP 5.5.9+ adds the new static `class` property which provides the fully qualified class name. This is preferred over using class name strings as these references are checked by the parser. * Shift core files * Shift to Throwable * Add laravel/ui dependency * Unindent vendor mail templates * Shift config files * Default config files In an effort to make upgrading the constantly changing config files easier, Shift defaulted them so you can review the commit diff for changes. Moving forward, you should use ENV variables or create a separate config file to allow the core config files to remain automatically upgradeable. * Shift Laravel dependencies * Shift cleanup * Upgrade to Laravel 7 Co-authored-by: Laravel Shift <shift@laravelshift.com>
274 lines
8.0 KiB
PHP
274 lines
8.0 KiB
PHP
<?php
|
|
/**
|
|
* Invoice Ninja (https://invoiceninja.com).
|
|
*
|
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
|
*
|
|
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
|
|
*
|
|
* @license https://opensource.org/licenses/AAL
|
|
*/
|
|
|
|
namespace App\Http\Controllers\Contact;
|
|
|
|
use App\Http\Controllers\BaseController;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Jobs\Account\CreateAccount;
|
|
use App\Libraries\MultiDB;
|
|
use App\Libraries\OAuth\OAuth;
|
|
use App\Models\ClientContact;
|
|
use App\Models\User;
|
|
use App\Transformers\ClientContactLoginTransformer;
|
|
use App\Transformers\UserTransformer;
|
|
use App\Utils\Traits\UserSessionAttributes;
|
|
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Laravel\Socialite\Facades\Socialite;
|
|
|
|
class LoginController extends BaseController
|
|
{
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Login Controller
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This controller handles authenticating users for the application and
|
|
| redirecting them to your home screen. The controller uses a trait
|
|
| to conveniently provide its functionality to your applications.
|
|
|
|
|
*/
|
|
|
|
use AuthenticatesUsers;
|
|
use UserSessionAttributes;
|
|
|
|
protected $entity_type = ClientContact::class;
|
|
|
|
protected $entity_transformer = ClientContactLoginTransformer::class;
|
|
|
|
/**
|
|
* Create a new controller instance.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
}
|
|
|
|
/**
|
|
* Login via API.
|
|
*
|
|
* @param \Illuminate\Http\Request $request The request
|
|
*
|
|
* @return Response|User Process user login.
|
|
*/
|
|
public function apiLogin(Request $request)
|
|
{
|
|
Auth::shouldUse('contact');
|
|
|
|
$this->validateLogin($request);
|
|
|
|
if ($this->hasTooManyLoginAttempts($request)) {
|
|
$this->fireLockoutEvent($request);
|
|
|
|
return response()->json(['message' => 'Too many login attempts, you are being throttled']);
|
|
}
|
|
|
|
if ($this->attemptLogin($request)) {
|
|
return $this->itemResponse($this->guard()->user());
|
|
} else {
|
|
$this->incrementLoginAttempts($request);
|
|
|
|
return response()->json(['message' => ctrans('texts.invalid_credentials')]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Redirect the user to the provider authentication page.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function redirectToProvider(string $provider)
|
|
{
|
|
//'https://www.googleapis.com/auth/gmail.send','email','profile','openid'
|
|
//
|
|
if (request()->has('code')) {
|
|
return $this->handleProviderCallback($provider);
|
|
} else {
|
|
return Socialite::driver($provider)->scopes()->redirect();
|
|
}
|
|
}
|
|
|
|
public function redirectToProviderAndCreate(string $provider)
|
|
{
|
|
$redirect_url = config('services.'.$provider.'.redirect').'/create';
|
|
|
|
if (request()->has('code')) {
|
|
return $this->handleProviderCallbackAndCreate($provider);
|
|
} else {
|
|
return Socialite::driver($provider)->redirectUrl($redirect_url)->redirect();
|
|
}
|
|
}
|
|
|
|
/*
|
|
public function handleProviderCallbackAndCreate(string $provider)
|
|
{
|
|
$socialite_user = Socialite::driver($provider)
|
|
->stateless()
|
|
->user();
|
|
|
|
if($user = OAuth::handleAuth($socialite_user, $provider))
|
|
{
|
|
Auth::login($user, true);
|
|
|
|
return redirect($this->redirectTo);
|
|
}
|
|
else if(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');
|
|
}
|
|
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_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);
|
|
}
|
|
|
|
}
|
|
*/
|
|
|
|
/**
|
|
* We use this function when OAUTHING via the web interface.
|
|
*
|
|
* @return redirect
|
|
|
|
public function handleProviderCallback(string $provider)
|
|
{
|
|
$socialite_user = Socialite::driver($provider)
|
|
->stateless()
|
|
->user();
|
|
|
|
if($user = OAuth::handleAuth($socialite_user, $provider))
|
|
{
|
|
Auth::login($user, true);
|
|
|
|
return redirect($this->redirectTo);
|
|
}
|
|
else if(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');
|
|
}
|
|
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_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);
|
|
}
|
|
|
|
}
|
|
*/
|
|
|
|
/**
|
|
* A client side authentication has taken place.
|
|
* We now digest the token and confirm authentication with
|
|
* the authentication server, the correct user object
|
|
* is returned to us here and we send back the correct
|
|
* user object payload - or error.
|
|
*
|
|
* This can be extended to a create route also - need to pass a ?create query parameter and
|
|
* then process the signup
|
|
*
|
|
* return User $user
|
|
*/
|
|
public function oauthApiLogin()
|
|
{
|
|
$user = false;
|
|
|
|
$oauth = new OAuth();
|
|
|
|
$user = $oauth->getProvider(request()->input('provider'))->getTokenResponse(request()->input('token'));
|
|
|
|
if ($user) {
|
|
return $this->itemResponse($user);
|
|
} else {
|
|
return $this->errorResponse(['message' => 'Invalid credentials'], 401);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Received the returning object from the provider
|
|
* which we will use to resolve the user, we return the response in JSON format
|
|
*
|
|
* @return json
|
|
|
|
public function handleProviderCallbackApiUser(string $provider)
|
|
{
|
|
$socialite_user = Socialite::driver($provider)->stateless()->user();
|
|
|
|
if($user = OAuth::handleAuth($socialite_user, $provider))
|
|
{
|
|
return $this->itemResponse($user);
|
|
}
|
|
else if(MultiDB::checkUserEmailExists($socialite_user->getEmail()))
|
|
{
|
|
|
|
return $this->errorResponse(['message'=>'User exists in system, but not with this authentication method'], 400);
|
|
|
|
}
|
|
else {
|
|
//todo
|
|
$name = OAuth::splitName($socialite_user->getName());
|
|
|
|
$new_account = [
|
|
'first_name' => $name[0],
|
|
'last_name' => $name[1],
|
|
'password' => '',
|
|
'email' => $socialite_user->getEmail(),
|
|
];
|
|
|
|
$account = CreateAccount::dispatchNow($new_account);
|
|
|
|
return $this->itemResponse($account->default_company->owner());
|
|
}
|
|
|
|
|
|
}
|
|
*/
|
|
}
|