laravel restful api not returning access_token

Viewed 818

i build an restful api in laravel 8 and passport what worked fine up to the moment i wanted to add authorization. i found several examples in the net how to register and login (all looked the same) but when i register a user i get something back what does not look like the access_token they show in their example. I get always something back like this:

{
    "user": {
        "id": 1,
        "name": "Georg Stein",
        "email": "xxx@test.de",
        "email_verified_at": null,
        "created_at": "2021-08-24T06:40:51.000000Z",
        "updated_at": "2021-08-24T06:40:51.000000Z"
    },
    "access_token": {
        "name": "authToken 2021-08-24 13:27:58",
        "abilities": [
            "*"
        ],
        "tokenable_id": 1,
        "tokenable_type": "App\\Models\\User",
        "updated_at": "2021-08-24T13:27:58.000000Z",
        "created_at": "2021-08-24T13:27:58.000000Z",
        "id": 21
    }
}    

what do i wrong here?

Georg

3 Answers

In User.php change from

use Laravel\Sanctum\HasApiTokens;

to

use Laravel\Passport\HasApiTokens;

and then 'php artisan serve' again!

here the needed File contents: auth.php:

...'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    "api" => [
        "driver" => "passport",
        "provider" => "users",
        //"hash" => false,
    ]
],...

User.php Model

...
namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];
...

AuthServiceProvider:

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Models\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();        
        Passport::routes();
    }
}

AuthController:

<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller {
    public function register(Request $request) {
        error_log("REGISTER");
        $validatedData = $request->validate([
           "name" => "required|max:55",
            "email" => "email|required|unique:users",
            "password" => "required|confirmed"
        ]);
        error_log("REGISTER - validated");
        $validatedData["password"] = bcrypt($request->password);
        
        $user = User::create($validatedData);
        
        $accessToken = $user->createToken("authToken")->accessToken;
        error_log("REGISTER CALLED Token: ".$accessToken);
        return response(["message" => "you are now registered", "user" => $user, "access_token" => $accessToken], 201);
    }
    
    public function login (Request $request) {
        error_log("LOGIN");
        $loginData = $request->validate([
           "email" => "email|required",
            "password" => "required"
        ]);
        
        if (!auth()->attempt($loginData)) {
            return response(["message" => "This user does not exist, check your details"], 400);
        }
        error_log("LOGIN - User: ". json_encode(auth()->user()));
        
        $accessToken = auth()->user()->createToken(auth()->user()->email." authToken ".now())->accessToken;
        error_log("LOGIN - Token: ".$accessToken);
        
        return response(["user" => auth()->user(), "access_token" => $accessToken]);
    }
}

routes/api.php:

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\API\AuthController;
use App\Http\Controllers\API\WerkstattController;
/*
|--------------------------------------------------------------------------
| 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("register", [\App\Http\Controllers\API\AuthController::class]);
Route::post("register", "\App\Http\Controllers\API\AuthController@register");
//Route::post("login", [\App\Http\Controllers\API\AuthController::class, "login"]);
Route::post("login", "\App\Http\Controllers\API\AuthController@login");

Route::apiResource("werkstatt", WerkstattController::class)->middleware("auth:api");

hope i didn't miss something important here to post Georg

In User.php change from

use Laravel\Sanctum\HasApiTokens;

to

use Laravel\Passport\HasApiTokens;

and then 'php artisan serve' again!

it is work for me thanks...

Related