Home > Software design >  My login route returns "unauthorised access" Laravel
My login route returns "unauthorised access" Laravel

Time:10-28

So I'm trying to make a laravel API for a escorts-like site, anyway, i use Passport for authentification and the register part works but the login one doesnt, and i dont know why, i'll let the passportAuthController down as code and a ss of the database

class passportAuthController extends Controller
{
    /**
     * handle user registration request
     */
    public function registerUserExample(RegisterUserRequest $request){
        ///TODO: TEST THE CRUD FEATURES IMPLEMENTED IN THE USER CONTROLLER AFTER U CHECK LOGIN FEATURE
        $attributes = $request -> validated();
        $user = User::create($attributes);
        
        $access_token_example = $user->createToken('RegisterToken')->accessToken;
        //return the access token we generated in the above step
        return response()->json(['token'=>$access_token_example],200);
    }

    /**
     * login user to our application
     */
    public function loginUserExample(Request $request){
        $login_credentials=[
            'email'=>$request->email,
            'password'=>$request->password,
        ];
        if(auth()->attempt($login_credentials)){
            //generate the token for the user
            $user_login_token= auth()->user()->createToken('LoginToken')->accessToken;
            //now return this token on success login attempt
            return response()->json(['token' => $user_login_token], 200);
        }
        else{
            //wrong login credentials, return, user not authorised to our system, return error code 401
            return response()->json(['error' => 'UnAuthorised Access'], 401);
        }
    }

    /**
     * This method returns authenticated user details
     */
//    index function
    public function authenticatedUserDetails(){
        //returns details
        return response()->json(['authenticated-user' => auth()->user()], 200);
    }


}


The request as well:


<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RegisterUserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name'=>'required|max:255|min:3',
            'email'=>'required|email',
            'password'=>'required|min:7|max:255',
            'gender'=>'required|min:4|max:6',
            'interest'=>'required|min:4|max:6',
            'Country'=>'required|max:255',
            'County'=>'required|max:255',
            'City'=>'required|max:255',
            'birthday'=>'required|date'
        ];
    }
}

and the ss of the database:

the database ss

and the routes (api.php):


<?php

use App\Http\Controllers\passportAuthController;
use App\Http\Controllers\UserController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| 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();
});


//routes/api.php

//login & register routes
Route::post('register',[passportAuthController::class,'registerUserExample']);
Route::post('login',[passportAuthController::class,'loginUserExample']);

//CRUD and search routes
Route::post('storeUser',[UserController::class,'store']);
Route::get('showAll',[UserController::class, 'index']);
Route::put('updateUser/{id}',[UserController::class,'update']);
Route::delete('delete/{id}', [UserController::class,'deleteUser']);
Route::get('search/{name}',[UserController::class,'search']);

//add this middleware to ensure that every request is authenticated
Route::middleware('auth:api')->group(function(){
    Route::get('user', [passportAuthController::class,'authenticatedUserDetails']);
});


CodePudding user response:

so if you see the response is mean that wrong login credentials, return, user not authorised to our system, return error code 401 ,

So with a little observation you will know that your code work fine but your logic is not good ,

So the answer simply is because the password insert in your database is note crypted and laravel passport when they are trying to make login they use a function of check ,

so if you want your code work your password must be crypted in the register exemple

$user->password = hash::make($request->password);

Or

$user->password = Crypt::encrypt($request->password);

Conclusion you can't make authentification with laravel passport if your password not crypted

CodePudding user response:

Your password in users table is not encrypted. The reason is this line

$attributes = $request->validated();
$user = User::create($attributes);

You have not encrypted your password and the method auth()->attempt($login_credentials) uses compares the encrypted password request with stored encrypted password in your db. You can use bcrpyt() to encrypt your password, laravel comes with bcrypt() as a helper function.

Change to this in your registerUserExample(RegisterUserRequest $request)

$attributes = $request->validated();
            
foreach($attributes as $key => $attribute){
    if($key == 'password') {
        $attributes[$key] = bcrypt($attribute);
    }
}

$user = User::create($attributes);

CodePudding user response:

The attempt method accepts an array of key / value pairs as its first argument. The password value will be hashed. The other values in the array will be used to find the user in your database table. So,

You try this

public function loginUserExample(Request $request){
    $user = User::where('account', $request->account)
                ->where('password', $request->password)
                ->first();
    
    if($user) {
        Auth::loginUsingId($user->id);
        // -- OR -- //
        Auth::login($user);
        return redirect()->route('home');
    } else {
        return redirect()->back()->withInput();
    }
}
  • Related