'How does the Laravel Sanctum work with the old database to create API authentication?
I have very different requirements with the Laravel auth for API because the database structure and data are old and we just want to create the API for the mobile app with the help of the same database and the Laravel 9 framework. So I am using my custom Model instead of User and also the customer query instead of Auth::attempt();
For more detail please check the Model, Controller & errors detail below
Route/api.php
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\API\AuthController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Route::post('login', [AuthController::class, 'signin']);
app/Http/Controllers/Api/AuthController.php
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use Illuminate\Support\Facades\Auth;
use Validator;
use App\Models\User;
use App\Models\Customer;
class AuthController extends BaseController
{
public function signin(Request $request)
{
if(empty($request->username)) {
return $this->sendError('Unauthorised.', ['error'=>'Please fill your CustomerId/Mobile.']);
}elseif(empty($request->password)) {
return $this->sendError('Unauthorised.', ['error'=>'Please fill your password.']);
} else {
$userData = Customer::select('code','name', 'member_code','mobile')->where('mobile', $request->username)->orWhere('member_code', $request->username)->first();
if(!empty($userData->code)){
$authUser = Auth::login($userData);
//$authUser = Auth::loginUsingId($userData->code);
//$success['token'] = $authUser->createToken('JShineApp')->plainTextToken;
//$success['name'] = $userData->name;
return $this->sendResponse($success, 'User signed in');
}else{
return $this->sendError('Unauthorised.', ['error'=>'Invalid login detail please try again with valid login detail.']);
}
}
}
}
app/Http/Controllers/Api/BaseController.php
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class BaseController extends Controller
{
/**
* success response method.
*
* @return \Illuminate\Http\Response
*/
public function sendResponse($result, $message)
{
$response = [
'success' => true,
'data' => $result,
'message' => $message,
];
return response()->json($response, 200);
}
/**
* return error response.
*
* @return \Illuminate\Http\Response
*/
public function sendError($error, $errorMessages = [], $code = 404)
{
$response = [
'success' => false,
'message' => $error,
];
if(!empty($errorMessages)){
$response['data'] = $errorMessages;
}
return response()->json($response, $code);
}
}
ERRORS
Illuminate\\Auth\\SessionGuard::login(): Argument #1 ($user) must be of type Illuminate\\Contracts\\Auth\\Authenticatable, App\\Models\\Customer given, called in D:\\projects\\htdocs\\api\\vendor\\laravel\\framework\\src\\Illuminate\\Auth\\AuthManager.php on line 336
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|

