mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-31 06:34:34 -04:00
Working on Social Authentication (#2458)
* Laravel Socialite + Refactor for searching for Users across multiple databases * Refactor for Unique User Rules, add Middleware for setting active DB connection per request, more tests
This commit is contained in:
parent
62e2444a2c
commit
f745c3f0a6
@ -22,8 +22,13 @@ if (! defined('APP_NAME')) {
|
|||||||
define('TEST_CLIENTNAME', env('TEST_CLIENTNAME', 'client@example.com'));
|
define('TEST_CLIENTNAME', env('TEST_CLIENTNAME', 'client@example.com'));
|
||||||
define('TEST_PASSWORD', 'password');
|
define('TEST_PASSWORD', 'password');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
define('BANK_LIBRARY_OFX', 1);
|
define('BANK_LIBRARY_OFX', 1);
|
||||||
define('MULTI_DBS', serialize(['db-ninja-1', 'db-ninja-2']));
|
define('MULTI_DBS', serialize(['db-ninja-1', 'db-ninja-2']));
|
||||||
|
|
||||||
|
define('SOCIAL_GOOGLE', 'Google');
|
||||||
|
define('SOCIAL_FACEBOOK', 'Facebook');
|
||||||
|
define('SOCIAL_GITHUB', 'GitHub');
|
||||||
|
define('SOCIAL_LINKEDIN', 'LinkedIn');
|
||||||
|
define('SOCIAL_TWITTER', 'Twitter');
|
||||||
|
define('SOCIAL_BITBUCKET', 'Bitbucket');
|
||||||
}
|
}
|
@ -4,6 +4,7 @@ namespace App\Http\Controllers\Auth;
|
|||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
||||||
|
use Laravel\Socialite\Facades\Socialite;
|
||||||
|
|
||||||
class LoginController extends Controller
|
class LoginController extends Controller
|
||||||
{
|
{
|
||||||
@ -36,4 +37,16 @@ class LoginController extends Controller
|
|||||||
{
|
{
|
||||||
$this->middleware('guest:user')->except('logout');
|
$this->middleware('guest:user')->except('logout');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function redirectToProvider($provider)
|
||||||
|
{
|
||||||
|
return Socialite::driver($provider)->redirect();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handleProviderCallback($provider)
|
||||||
|
{
|
||||||
|
$user = Socialite::driver('github')->user();
|
||||||
|
|
||||||
|
dd($user);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
use App\Http\Requests\SignupRequest;
|
|
||||||
|
|
||||||
class HomeController extends Controller
|
class HomeController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -33,14 +31,5 @@ class HomeController extends Controller
|
|||||||
return view('dashboard.index');
|
return view('dashboard.index');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function signup()
|
|
||||||
{
|
|
||||||
return view('signup.index');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function processSignup(SignupRequest $request)
|
|
||||||
{
|
|
||||||
dd($request->validated());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
38
app/Http/Controllers/SignupController.php
Normal file
38
app/Http/Controllers/SignupController.php
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Http\Requests\SignupRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class SignupController
|
||||||
|
* @package App\Http\Controllers
|
||||||
|
*/
|
||||||
|
class SignupController extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SignupController constructor.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->middleware('guest');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function signup()
|
||||||
|
{
|
||||||
|
return view('signup.index');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param SignupRequest $request
|
||||||
|
*/
|
||||||
|
public function processSignup(SignupRequest $request)
|
||||||
|
{
|
||||||
|
dd($request->validated());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -41,6 +41,9 @@ class Kernel extends HttpKernel
|
|||||||
'throttle:60,1',
|
'throttle:60,1',
|
||||||
'bindings',
|
'bindings',
|
||||||
],
|
],
|
||||||
|
'db' => [
|
||||||
|
|
||||||
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
26
app/Http/Middleware/setDb.php
Normal file
26
app/Http/Middleware/setDb.php
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use App\Libraries\MultiDB;
|
||||||
|
use Closure;
|
||||||
|
|
||||||
|
class setDb
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle an incoming request.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
* @param \Closure $next
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function handle($request, Closure $next)
|
||||||
|
{
|
||||||
|
if (!config('auth.providers.users.driver') == 'eloquent') {
|
||||||
|
|
||||||
|
//MultiDB::setDB(auth()->user()->)
|
||||||
|
}
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Http\ValidationRules;
|
namespace App\Http\ValidationRules;
|
||||||
|
|
||||||
|
use App\Libraries\MultiDB;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use Illuminate\Contracts\Validation\Rule;
|
use Illuminate\Contracts\Validation\Rule;
|
||||||
|
|
||||||
@ -10,7 +11,7 @@ class UniqueUserRule implements Rule
|
|||||||
|
|
||||||
public function passes($attribute, $value)
|
public function passes($attribute, $value)
|
||||||
{
|
{
|
||||||
return $this->checkIfEmailExists($value);
|
return ! $this->checkIfEmailExists($value); //if it exists, return false!
|
||||||
}
|
}
|
||||||
|
|
||||||
public function message()
|
public function message()
|
||||||
@ -20,23 +21,7 @@ class UniqueUserRule implements Rule
|
|||||||
|
|
||||||
private function checkIfEmailExists($email) : bool
|
private function checkIfEmailExists($email) : bool
|
||||||
{
|
{
|
||||||
if (config('auth.providers.users.driver') == 'eloquent') //default eloquent = single DB
|
return MultiDB::checkUserEmailExists($email);
|
||||||
{
|
|
||||||
return User::where(['email' => $email])->get()->count() == 0 ?? false; // true -> 0 emails found / false -> >=1 emails found
|
|
||||||
}
|
|
||||||
|
|
||||||
//multi-db active
|
|
||||||
foreach (unserialize(MULTI_DBS) as $db)
|
|
||||||
{
|
|
||||||
if(User::on($db)->where(['email' => $email])->get()->count() >=1) // if user already exists, validation will fail
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
71
app/Libraries/MultiDB.php
Normal file
71
app/Libraries/MultiDB.php
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Libraries;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class MultiDB
|
||||||
|
* @package App\Libraries
|
||||||
|
*/
|
||||||
|
class MultiDB
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $email
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function checkUserEmailExists($email) : bool
|
||||||
|
{
|
||||||
|
if (config('auth.providers.users.driver') == 'eloquent') //default eloquent = single DB
|
||||||
|
{
|
||||||
|
return User::where(['email' => $email])->get()->count() >= 1 ?? false; // true >= 1 emails found / false -> == emails found
|
||||||
|
}
|
||||||
|
|
||||||
|
//multi-db active
|
||||||
|
foreach (unserialize(MULTI_DBS) as $db)
|
||||||
|
{
|
||||||
|
if(User::on($db)->where(['email' => $email])->get()->count() >=1) // if user already exists, validation will fail
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function getUser(array $data)
|
||||||
|
{
|
||||||
|
if (config('auth.providers.users.driver') == 'eloquent') //default eloquent = single DB
|
||||||
|
{
|
||||||
|
return User::where($data)->first();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (unserialize(MULTI_DBS) as $db)
|
||||||
|
{
|
||||||
|
self::setDB($db);
|
||||||
|
|
||||||
|
$user = User::where($data)->first();
|
||||||
|
|
||||||
|
if($user)
|
||||||
|
return $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $database
|
||||||
|
*/
|
||||||
|
public static function setDB($database) : void
|
||||||
|
{
|
||||||
|
/* This will set the default configuration for the request */
|
||||||
|
config(['database.default' => $database]);
|
||||||
|
app('db')->connection(config('database.connections.database.'.$database));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
35
app/Libraries/OAuth.php
Normal file
35
app/Libraries/OAuth.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Libraries;
|
||||||
|
|
||||||
|
use Laravel\Socialite\Facades\Socialite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class OAuth
|
||||||
|
* @package App\Libraries
|
||||||
|
*/
|
||||||
|
class OAuth
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Socialite Providers
|
||||||
|
*/
|
||||||
|
const SOCIAL_GOOGLE = 1;
|
||||||
|
const SOCIAL_FACEBOOK = 2;
|
||||||
|
const SOCIAL_GITHUB = 3;
|
||||||
|
const SOCIAL_LINKEDIN = 4;
|
||||||
|
const SOCIAL_TWITTER = 5;
|
||||||
|
const SOCIAL_BITBUCKET = 6;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Socialite $user
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static function handleAuth($user)
|
||||||
|
{
|
||||||
|
if(MultiDB::checkUserEmailExists($user->getEmail())) //if email is in the system this is an existing user -> check they are arriving on the correct provider
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -208,7 +208,7 @@ class MultiDatabaseUserProvider implements UserProvider
|
|||||||
|
|
||||||
private function setDefaultDatabase($id = false, $email = false, $token = false) : void
|
private function setDefaultDatabase($id = false, $email = false, $token = false) : void
|
||||||
{
|
{
|
||||||
$databases = ['db-ninja-1', 'db-ninja-2'];
|
$databases = unserialize(MULTI_DBS);
|
||||||
|
|
||||||
foreach ($databases as $database) {
|
foreach ($databases as $database) {
|
||||||
$this->setDB($database);
|
$this->setDB($database);
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
"davejamesmiller/laravel-breadcrumbs": "5.x",
|
"davejamesmiller/laravel-breadcrumbs": "5.x",
|
||||||
"fideloper/proxy": "^4.0",
|
"fideloper/proxy": "^4.0",
|
||||||
"laravel/framework": "5.7.*",
|
"laravel/framework": "5.7.*",
|
||||||
|
"laravel/socialite": "^3.1",
|
||||||
"laravel/tinker": "^1.0",
|
"laravel/tinker": "^1.0",
|
||||||
"spatie/laravel-html": "^2.19",
|
"spatie/laravel-html": "^2.19",
|
||||||
"webpatser/laravel-countries": "dev-master#75992ad"
|
"webpatser/laravel-countries": "dev-master#75992ad"
|
||||||
|
359
composer.lock
generated
359
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "c9e2e008fc8ade0315e2c39e1934152d",
|
"content-hash": "0a3a5aeaabd9e3362e0da55be647367c",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "asgrim/ofxparser",
|
"name": "asgrim/ofxparser",
|
||||||
@ -481,6 +481,187 @@
|
|||||||
],
|
],
|
||||||
"time": "2018-02-07T20:20:57+00:00"
|
"time": "2018-02-07T20:20:57+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "guzzlehttp/guzzle",
|
||||||
|
"version": "6.3.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/guzzle/guzzle.git",
|
||||||
|
"reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba",
|
||||||
|
"reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"guzzlehttp/promises": "^1.0",
|
||||||
|
"guzzlehttp/psr7": "^1.4",
|
||||||
|
"php": ">=5.5"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ext-curl": "*",
|
||||||
|
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
|
||||||
|
"psr/log": "^1.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"psr/log": "Required for using the Log middleware"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "6.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"src/functions_include.php"
|
||||||
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"GuzzleHttp\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Michael Dowling",
|
||||||
|
"email": "mtdowling@gmail.com",
|
||||||
|
"homepage": "https://github.com/mtdowling"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Guzzle is a PHP HTTP client library",
|
||||||
|
"homepage": "http://guzzlephp.org/",
|
||||||
|
"keywords": [
|
||||||
|
"client",
|
||||||
|
"curl",
|
||||||
|
"framework",
|
||||||
|
"http",
|
||||||
|
"http client",
|
||||||
|
"rest",
|
||||||
|
"web service"
|
||||||
|
],
|
||||||
|
"time": "2018-04-22T15:46:56+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "guzzlehttp/promises",
|
||||||
|
"version": "v1.3.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/guzzle/promises.git",
|
||||||
|
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
|
||||||
|
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.5.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"GuzzleHttp\\Promise\\": "src/"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/functions_include.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Michael Dowling",
|
||||||
|
"email": "mtdowling@gmail.com",
|
||||||
|
"homepage": "https://github.com/mtdowling"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Guzzle promises library",
|
||||||
|
"keywords": [
|
||||||
|
"promise"
|
||||||
|
],
|
||||||
|
"time": "2016-12-20T10:07:11+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "guzzlehttp/psr7",
|
||||||
|
"version": "1.4.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/guzzle/psr7.git",
|
||||||
|
"reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
|
||||||
|
"reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.0",
|
||||||
|
"psr/http-message": "~1.0"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"psr/http-message-implementation": "1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"GuzzleHttp\\Psr7\\": "src/"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/functions_include.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Michael Dowling",
|
||||||
|
"email": "mtdowling@gmail.com",
|
||||||
|
"homepage": "https://github.com/mtdowling"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Tobias Schultze",
|
||||||
|
"homepage": "https://github.com/Tobion"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PSR-7 message implementation that also provides common utility methods",
|
||||||
|
"keywords": [
|
||||||
|
"http",
|
||||||
|
"message",
|
||||||
|
"request",
|
||||||
|
"response",
|
||||||
|
"stream",
|
||||||
|
"uri",
|
||||||
|
"url"
|
||||||
|
],
|
||||||
|
"time": "2017-03-20T17:10:46+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "jakub-onderka/php-console-color",
|
"name": "jakub-onderka/php-console-color",
|
||||||
"version": "v0.2",
|
"version": "v0.2",
|
||||||
@ -709,6 +890,69 @@
|
|||||||
],
|
],
|
||||||
"time": "2018-10-09T13:28:28+00:00"
|
"time": "2018-10-09T13:28:28+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "laravel/socialite",
|
||||||
|
"version": "v3.1.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/laravel/socialite.git",
|
||||||
|
"reference": "65f771ff4f266ebae23de1a3f18efd80a1da2f8d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/laravel/socialite/zipball/65f771ff4f266ebae23de1a3f18efd80a1da2f8d",
|
||||||
|
"reference": "65f771ff4f266ebae23de1a3f18efd80a1da2f8d",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"guzzlehttp/guzzle": "~6.0",
|
||||||
|
"illuminate/contracts": "~5.4",
|
||||||
|
"illuminate/http": "~5.4",
|
||||||
|
"illuminate/support": "~5.4",
|
||||||
|
"league/oauth1-client": "~1.0",
|
||||||
|
"php": ">=5.6.4"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"mockery/mockery": "~0.9",
|
||||||
|
"phpunit/phpunit": "~4.0|~5.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.0-dev"
|
||||||
|
},
|
||||||
|
"laravel": {
|
||||||
|
"providers": [
|
||||||
|
"Laravel\\Socialite\\SocialiteServiceProvider"
|
||||||
|
],
|
||||||
|
"aliases": {
|
||||||
|
"Socialite": "Laravel\\Socialite\\Facades\\Socialite"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Laravel\\Socialite\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Taylor Otwell",
|
||||||
|
"email": "taylor@laravel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.",
|
||||||
|
"homepage": "https://laravel.com",
|
||||||
|
"keywords": [
|
||||||
|
"laravel",
|
||||||
|
"oauth"
|
||||||
|
],
|
||||||
|
"time": "2018-08-16T12:51:21+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/tinker",
|
"name": "laravel/tinker",
|
||||||
"version": "v1.0.8",
|
"version": "v1.0.8",
|
||||||
@ -856,6 +1100,69 @@
|
|||||||
],
|
],
|
||||||
"time": "2018-10-15T13:53:10+00:00"
|
"time": "2018-10-15T13:53:10+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "league/oauth1-client",
|
||||||
|
"version": "1.7.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/thephpleague/oauth1-client.git",
|
||||||
|
"reference": "fca5f160650cb74d23fc11aa570dd61f86dcf647"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/fca5f160650cb74d23fc11aa570dd61f86dcf647",
|
||||||
|
"reference": "fca5f160650cb74d23fc11aa570dd61f86dcf647",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"guzzlehttp/guzzle": "^6.0",
|
||||||
|
"php": ">=5.5.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"mockery/mockery": "^0.9",
|
||||||
|
"phpunit/phpunit": "^4.0",
|
||||||
|
"squizlabs/php_codesniffer": "^2.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"League\\OAuth1\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Ben Corlett",
|
||||||
|
"email": "bencorlett@me.com",
|
||||||
|
"homepage": "http://www.webcomm.com.au",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "OAuth 1.0 Client Library",
|
||||||
|
"keywords": [
|
||||||
|
"Authentication",
|
||||||
|
"SSO",
|
||||||
|
"authorization",
|
||||||
|
"bitbucket",
|
||||||
|
"identity",
|
||||||
|
"idp",
|
||||||
|
"oauth",
|
||||||
|
"oauth1",
|
||||||
|
"single sign on",
|
||||||
|
"trello",
|
||||||
|
"tumblr",
|
||||||
|
"twitter"
|
||||||
|
],
|
||||||
|
"time": "2016-08-17T00:36:58+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "monolog/monolog",
|
"name": "monolog/monolog",
|
||||||
"version": "1.23.0",
|
"version": "1.23.0",
|
||||||
@ -1195,6 +1502,56 @@
|
|||||||
],
|
],
|
||||||
"time": "2017-02-14T16:28:37+00:00"
|
"time": "2017-02-14T16:28:37+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/http-message",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/http-message.git",
|
||||||
|
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||||
|
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Http\\Message\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interface for HTTP messages",
|
||||||
|
"homepage": "https://github.com/php-fig/http-message",
|
||||||
|
"keywords": [
|
||||||
|
"http",
|
||||||
|
"http-message",
|
||||||
|
"psr",
|
||||||
|
"psr-7",
|
||||||
|
"request",
|
||||||
|
"response"
|
||||||
|
],
|
||||||
|
"time": "2016-08-06T14:39:51+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/log",
|
"name": "psr/log",
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
|
@ -39,5 +39,38 @@ return [
|
|||||||
'key' => env('STRIPE_KEY'),
|
'key' => env('STRIPE_KEY'),
|
||||||
'secret' => env('STRIPE_SECRET'),
|
'secret' => env('STRIPE_SECRET'),
|
||||||
],
|
],
|
||||||
|
'stripe' => [
|
||||||
|
'model' => 'User',
|
||||||
|
'secret' => '',
|
||||||
|
],
|
||||||
|
'github' => [
|
||||||
|
'client_id' => env('GITHUB_CLIENT_ID'),
|
||||||
|
'client_secret' => env('GITHUB_CLIENT_SECRET'),
|
||||||
|
'redirect' => env('GITHUB_OAUTH_REDIRECT'),
|
||||||
|
],
|
||||||
|
'google' => [
|
||||||
|
'client_id' => env('GOOGLE_CLIENT_ID'),
|
||||||
|
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
|
||||||
|
'redirect' => env('GOOGLE_OAUTH_REDIRECT'),
|
||||||
|
],
|
||||||
|
'facebook' => [
|
||||||
|
'client_id' => env('FACEBOOK_CLIENT_ID'),
|
||||||
|
'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
|
||||||
|
'redirect' => env('FACEBOOK_OAUTH_REDIRECT'),
|
||||||
|
],
|
||||||
|
'linkedin' => [
|
||||||
|
'client_id' => env('LINKEDIN_CLIENT_ID'),
|
||||||
|
'client_secret' => env('LINKEDIN_CLIENT_SECRET'),
|
||||||
|
'redirect' => env('LINKEDIN_OAUTH_REDIRECT'),
|
||||||
|
],
|
||||||
|
'twitter' => [
|
||||||
|
'client_id' => env('TWITTER_CLIENT_ID'),
|
||||||
|
'client_secret' => env('TWITTER_CLIENT_SECRET'),
|
||||||
|
'redirect' => env('TWITTER_OAUTH_REDIRECT'),
|
||||||
|
],
|
||||||
|
'bitbucket' => [
|
||||||
|
'client_id' => env('BITBUCKET_CLIENT_ID'),
|
||||||
|
'client_secret' => env('BITBUCKET_CLIENT_SECRET'),
|
||||||
|
'redirect' => env('BITBUCKET_OAUTH_REDIRECT'),
|
||||||
|
],
|
||||||
];
|
];
|
@ -17,6 +17,11 @@ Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
|
|||||||
Route::post('login', 'Auth\LoginController@login');
|
Route::post('login', 'Auth\LoginController@login');
|
||||||
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
|
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
|
||||||
|
|
||||||
|
// Social authentication
|
||||||
|
|
||||||
|
Route::get('auth/{provider}', 'Auth\LoginController@redirectToProvider');
|
||||||
|
Route::get('auth/{provider}/callback', 'Auth\LoginController@handleProviderCallback');
|
||||||
|
|
||||||
// Password Reset Routes...
|
// Password Reset Routes...
|
||||||
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
|
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
|
||||||
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
|
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
|
||||||
@ -30,8 +35,8 @@ Open Routes
|
|||||||
Route::redirect('/', '/login', 301);
|
Route::redirect('/', '/login', 301);
|
||||||
|
|
||||||
|
|
||||||
Route::get('/signup', 'HomeController@signup')->name('signup');
|
Route::get('/signup', 'SignupController@signup')->name('signup');
|
||||||
Route::post('/process_signup', 'HomeController@processSignup')->name('signup.submit');
|
Route::post('/process_signup', 'SignupController@processSignup')->name('signup.submit');
|
||||||
|
|
||||||
Route::get('/contact/login', 'Auth\ContactLoginController@showLoginForm')->name('contact.login');
|
Route::get('/contact/login', 'Auth\ContactLoginController@showLoginForm')->name('contact.login');
|
||||||
Route::post('/contact/login', 'Auth\ContactLoginController@login')->name('contact.login.submit');
|
Route::post('/contact/login', 'Auth\ContactLoginController@login')->name('contact.login.submit');
|
||||||
@ -40,7 +45,7 @@ Route::post('/contact/login', 'Auth\ContactLoginController@login')->name('contac
|
|||||||
/*
|
/*
|
||||||
Authenticated User Routes
|
Authenticated User Routes
|
||||||
*/
|
*/
|
||||||
Route::group(['middleware' => ['auth:user']], function () {
|
Route::group(['middleware' => ['auth:user', 'db']], function () {
|
||||||
|
|
||||||
Route::get('/dashboard', 'HomeController@user')->name('user.dashboard');
|
Route::get('/dashboard', 'HomeController@user')->name('user.dashboard');
|
||||||
Route::get('/logout', 'Auth\LoginController@logout')->name('user.logout');
|
Route::get('/logout', 'Auth\LoginController@logout')->name('user.logout');
|
||||||
|
82
tests/Integration/MultiDBUserTest.php
Normal file
82
tests/Integration/MultiDBUserTest.php
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit;
|
||||||
|
|
||||||
|
use App\Libraries\MultiDB;
|
||||||
|
use App\Models\User;
|
||||||
|
use Illuminate\Foundation\Testing\Concerns\InteractsWithDatabase;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
* @covers App\Libraries\MultiDB
|
||||||
|
*
|
||||||
|
* Proves that we can reliably switch database connections at runtime
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class MultiDBUserTest extends TestCase
|
||||||
|
{
|
||||||
|
//use DatabaseMigrations;
|
||||||
|
use InteractsWithDatabase;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
if (config('auth.providers.users.driver') == 'eloquent')
|
||||||
|
$this->markTestSkipped('Multi DB not enabled - skipping');
|
||||||
|
|
||||||
|
User::unguard();
|
||||||
|
|
||||||
|
$user = [
|
||||||
|
'first_name' => 'user_db_1',
|
||||||
|
'last_name' => 'user_db_1-s',
|
||||||
|
'phone' => '55555',
|
||||||
|
'email_verified_at' => now(),
|
||||||
|
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
|
||||||
|
'remember_token' => str_random(10),
|
||||||
|
'email' => 'db1@example.com',
|
||||||
|
'oauth_user_id' => '123'
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
$user2 = [
|
||||||
|
'first_name' => 'user_db_2',
|
||||||
|
'last_name' => 'user_db_2-s',
|
||||||
|
'phone' => '55555',
|
||||||
|
'email_verified_at' => now(),
|
||||||
|
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
|
||||||
|
'remember_token' => str_random(10),
|
||||||
|
'email' => 'db2@example.com',
|
||||||
|
'oauth_user_id' => 'abc'
|
||||||
|
];
|
||||||
|
|
||||||
|
User::on('db-ninja-1')->create($user);
|
||||||
|
User::on('db-ninja-2')->create($user2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_oauth_user_db2_exists()
|
||||||
|
{
|
||||||
|
$user = MultiDB::getUser(['email' => 'db2@example.com', 'oauth_user_id' => 'abc']);
|
||||||
|
|
||||||
|
$this->assertEquals($user->email, 'db2@example.com');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_oauth_user_db1_exists()
|
||||||
|
{
|
||||||
|
$user = MultiDB::getUser(['email' => 'db1@example.com', 'oauth_user_id' => '123']);
|
||||||
|
|
||||||
|
$this->assertEquals($user->email, 'db1@example.com');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tearDown()
|
||||||
|
{
|
||||||
|
DB::connection('db-ninja-1')->table('users')->delete();
|
||||||
|
DB::connection('db-ninja-2')->table('users')->delete();
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@ namespace Tests\Unit;
|
|||||||
use App\Http\ValidationRules\UniqueUserRule;
|
use App\Http\ValidationRules\UniqueUserRule;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use Illuminate\Foundation\Testing\Concerns\InteractsWithDatabase;
|
use Illuminate\Foundation\Testing\Concerns\InteractsWithDatabase;
|
||||||
|
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
@ -15,7 +16,8 @@ use Tests\TestCase;
|
|||||||
*/
|
*/
|
||||||
class UniqueEmailTest extends TestCase
|
class UniqueEmailTest extends TestCase
|
||||||
{
|
{
|
||||||
use InteractsWithDatabase;
|
//use InteractsWithDatabase;
|
||||||
|
//use DatabaseMigrations;
|
||||||
|
|
||||||
protected $rule;
|
protected $rule;
|
||||||
|
|
||||||
@ -58,8 +60,8 @@ class UniqueEmailTest extends TestCase
|
|||||||
|
|
||||||
public function tearDown()
|
public function tearDown()
|
||||||
{
|
{
|
||||||
// DB::connection('db-ninja-1')->table('users')->delete();
|
DB::connection('db-ninja-1')->table('users')->delete();
|
||||||
// DB::connection('db-ninja-2')->table('users')->delete();
|
DB::connection('db-ninja-2')->table('users')->delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user