Added oauth login

This commit is contained in:
Deon George
2019-09-03 14:43:59 +10:00
parent 21ea60c4f9
commit 8224fba840
17 changed files with 426 additions and 21 deletions

View File

@@ -2,11 +2,20 @@
namespace App\Http\Controllers\Auth;
use App\Models\AccountOauth;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Socialite;
use App\Http\Controllers\Controller;
use App\Mail\SocialLink;
use App\Models\Oauth;
use App\User;
use function App\Console\Commands\object_to_array;
class SocialLoginController extends Controller
{
public function redirectToProvider($provider)
@@ -18,16 +27,97 @@ class SocialLoginController extends Controller
{
$openiduser = Socialite::with($provider)->user();
$user = Socialite::with($provider)->findOrCreateUser($openiduser);
$oo = Oauth::firstOrCreate(['name'=>$provider,'active'=>TRUE]);
Auth::login($user,FALSE);
// See if this user has connected and linked previously
$aoo = $oo->accounts->where('userid',$openiduser->id);
/*
if (! $user->profile_update)
if ($aoo->count() == 1)
{
return redirect()->to(url('settings'));
$aoo = $aoo->first();
if ((is_null($user=$aoo->user) AND (is_null($aoo->account) OR is_null($user=$aoo->account->user))) OR ! $user->active)
{
if (! $user) {
$user = User::where('email',$openiduser->email)->first();
}
if (! $user OR ! $user->active)
{
return redirect('/login')->with('error','Invalid account, or account inactive, please contact an admin.');
}
return $this->link($provider,$aoo,$user);
}
// All Set to login
Auth::login($user,FALSE);
// If there are too many users, then we have a problem
} elseif ($aoo->count() > 1) {
return redirect('/login')->with('error','Seems you have multiple oauth IDs, please contact an admin.');
// User is using OAUTH for the first time.
} else {
$uo = User::active()->where('email',$openiduser->email);
// See if their is an account with this email address
if ($uo->count() == 1)
{
$aoo = new AccountOauth;
$aoo->userid = $openiduser->id;
$aoo->oauth_data = $openiduser->user;
$oo->accounts()->save($aoo);
return $this->link($provider,$aoo,$uo->first());
// If there are too many users, then we have a problem
} elseif ($uo->count() > 1) {
return redirect('/login')->with('error','Seems you have multiple accounts, please contact an admin.');
} else {
return redirect('/login')->with('error','Seems you dont have an account with that email, please contact an admin.');
}
}
*/
return redirect()->intended();
}
/**
* We have identified the user and oauth, just need them to confirm the link
*
* @param $provider
* @param User $uo
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function link($provider,AccountOauth $ao,User $uo)
{
Mail::to($uo->email)->send(new SocialLink($ao));
return view('auth.social_link')
->with('oauthid',$ao->id)
->with('provider',$provider);
}
public function linkcomplete(Request $request,$provider)
{
// Load our oauth id
$aoo = AccountOauth::findOrFail($request->post('oauthid'));
// Check our email matches
if (Arr::get($aoo->oauth_data,'email','invalid') !== $request->post('email'))
return redirect('/login')->with('error','Account details didnt match to make link.');
// Check our token matches
if ($aoo->link_token !== $request->post('token'))
return redirect('/login')->with('error','Token details didnt match to make link.');
// Load our email.
$uo = User::where('email',$request->post('email'))->firstOrFail();
$aoo->user_id = $uo->id;
$aoo->save();
Auth::login($uo,FALSE);
return redirect()->intended();
}

View File

@@ -35,12 +35,12 @@ class OrderRequest extends Mailable
*/
public function build()
{
switch ($this->service->category)
switch (get_class($this->service->type))
{
case 'ADSL': $subject = sprintf('%s: %s',$this->service->category,$this->service->service_adsl->service_address);
case 'App\Models\Service\Adsl': $subject = sprintf('NBN: %s',$this->service->type->service_address);
break;
case 'VOIP': $subject = sprintf('%s: %s',$this->service->category,$this->service->service_voip->service_number);
case 'App\Models\Service\Voip': $subject = sprintf('VOIP: %s',$this->service->type->service_number);
break;
default:

43
app/Mail/SocialLink.php Normal file
View File

@@ -0,0 +1,43 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use App\Models\AccountOauth;
use App\User;
class SocialLink extends Mailable
{
use Queueable, SerializesModels;
public $token;
public $user;
/**
* Create a new message instance.
*
* @param User $o
* @param string $token
*/
public function __construct(AccountOauth $o)
{
$this->token = $o->link_token;
$this->user = $o;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this
->markdown('email.system.social_link')
->subject('Link your Account')
->with(['site'=>$this->user->site]);
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\User;
use App\Traits\NextKey;
class AccountOauth extends Model
{
use NextKey;
const RECORD_ID = 'account_oauth';
public $incrementing = FALSE;
protected $table = 'ab_account_oauth';
const CREATED_AT = 'date_orig';
const UPDATED_AT = 'date_last';
public $dateFormat = 'U';
protected $casts = [
'oauth_data'=>'array',
];
public function account()
{
return $this->belongsTo(Account::class);
}
public function site()
{
return $this->belongsTo(Site::class);
}
public function User()
{
return $this->belongsTo(User::class);
}
/**
* Get a link token to use when validating account.
*/
public function getLinkTokenAttribute()
{
return strtoupper(substr(md5($this->id.$this->date_last),0,8));
}
}

25
app/Models/Oauth.php Normal file
View File

@@ -0,0 +1,25 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\User;
use App\Traits\NextKey;
class Oauth extends Model
{
use NextKey;
const RECORD_ID = 'oauth';
public $incrementing = FALSE;
protected $table = 'ab_oauth';
public $timestamps = FALSE;
protected $fillable = ['name','active'];
public function accounts()
{
return $this->hasMany(AccountOauth::class);
}
}

View File

@@ -18,6 +18,9 @@ trait NextKey
static::creating(function($model)
{
$model->id = self::NextId();
if (! $model->site_id)
$model->site_id = config('SITE_SETUP')->id;
});
static::saved(function($model)

View File

@@ -2,6 +2,7 @@
namespace App;
use App\Models\Site;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;
@@ -82,6 +83,11 @@ class User extends Authenticatable
return $this->hasManyThrough(Models\Payment::class,Models\Account::class);
}
public function site()
{
return $this->belongsTo(Site::class);
}
public function services()
{
return $this->hasManyThrough(Models\Service::class,Models\Account::class);