Reputation: 490
I am trying to setup Passport in Laravel 8 with two guards, but keep running into issues. I am using Postman to test.
I have two tables setup:
I can successfully register a user in both tables. However I can only authenticate and retrieve a token in the login method for the users table. I keep getting "Invalid Credentials" on contacts table. I am pretty sure the reason for this is because it's looking at the users table and not the contacts table when trying to authenticate the user. I think I am missing something in the setup process to allow the use of different tables when authenticating.
My codes is as follows:
auth.php
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
'hash' => false,
],
'api-crm' => [
'driver' => 'passport',
'provider' => 'contacts',
'hash' => false,
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'contacts' => [
'driver' => 'eloquent',
'model' => App\Models\Contact::class,
],
],
api.php
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::post("/register", [ApiAuthController::class, 'register']);
Route::post("/login", [ApiAuthController::class, 'login']);
Route::post("/crm/register", [CrmAuthController::class, 'register']);
Route::post("/crm/login", [CrmAuthController::class, 'login']);
ApiAuthController.php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
class ApiAuthController extends Controller
{
public function register(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|max:55',
'email' => 'email|required|unique:users',
'password' => 'required|confirmed'
]);
$validatedData['password'] = bcrypt($request->password);
$user = User::create($validatedData);
$accessToken = $user->createToken('authToken')->accessToken;
return response([ 'user' => $user, 'access_token' => $accessToken]);
}
public function login(Request $request)
{
$loginData = $request->validate([
'email' => 'email|required',
'password' => 'required'
]);
if (!auth()->attempt($loginData)) {
return response(['message' => 'Invalid Credentials']);
}
$accessToken = auth()->user()->createToken('authToken')->accessToken;
return response(['user' => auth()->user(), 'access_token' => $accessToken]);
}
}
CrmAuthController.php
namespace App\Http\Controllers\CRM;
use App\Http\Controllers\Controller;
use App\Models\Contact;
use Illuminate\Http\Request;
class CrmAuthController extends Controller
{
public function register(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|max:55',
'email' => 'email|required|unique:users',
'password' => 'required|confirmed'
]);
$validatedData['password'] = bcrypt($request->password);
$user = Contact::create($validatedData);
$accessToken = $user->createToken('authToken')->accessToken;
return response([ 'user' => $user, 'access_token' => $accessToken]);
}
public function login(Request $request)
{
$loginData = $request->validate([
'email' => 'email|required',
'password' => 'required'
]);
if (!auth()->attempt($loginData)) {
return response(['message' => 'Invalid Credentials']);
}
$accessToken = auth()->user()->createToken('authToken')->accessToken;
return response(['user' => auth()->user(), 'access_token' => $accessToken]);
}
}
Upvotes: 0
Views: 652
Reputation: 36
In crmAuthController.php login method, when you use auth()->attempt($loginData) it looks to validate login data on default users table.
so instead of using the attempt($loginData) you have to get crm user by email using "Contact" Model in your case.
$loginData = $request->validate([
'email' => 'email|required',
'password' => 'required'
]);
$user = new \App\Models\Contact();
$check = $user->where('email',$loginData['email'])->exists();
if($check){
$users = $user->where('email',$loginData['email'])->first();
// verify the password
if (password_verify($loginData['password'],$users->password)) {
// Authentication passed...
$token = $users->createToken('YOUR TOKEN NAME');
return response($token);
}
else return response(['message' => 'Invalid Credentials']);
}
else return response(['message' => 'user doesnt exist with this email']);
Also once you logged in, to get the current user for CRM, use
Auth::guard('api-crm')->user();
Upvotes: 2