markwilliamsweb
markwilliamsweb

Reputation: 490

Laravel 8 Passport - Multi Auth setup

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:

  1. Users
  2. Contacts

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

Answers (1)

Naveen
Naveen

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

Related Questions