Opcjonalna autentykacja w laravel passport

0

Chciałbym zrobić routa z opcjonalną autentykacją, żeby wyświetlić na stronie głównej różne elementy w zależności od tego czy i kto jest zalogowany. Wszystkie tutoriale, które znajduję jakby pomijają taką potrzebę. Czy mógłby ktoś podpowiedzieć jak to zrobić?

Robiłem według tego tutoriala: https://medium.com/modulr/create-api-authentication-with-passport-of-laravel-5-6-1dc2d400a7f
Tutaj cały mój kod: https://github.com/team9lipca/handcrafters-service/tree/pierwsze-prace

Kiedy dobijam się przez postmana do api/auth/user z tokenem to dostaję jsona z userem. Jeżeli nie podam tokena to dostaję html ze stroną logowania (też nie wiem gdzie jest przekierowanie).

W internecie piszą, żeby zmienić middleware z api na web, ale wtedy dostaję pustego jsona niezależnie czy podam token czy nie. Routy po zmianach:

<?php
Route::group([
    'namespace' => 'Auth',
    'middleware' => 'api',
    'prefix' => 'auth'
], function () {
    Route::post('login', 'AuthController@login');
    Route::post('signup', 'AuthController@signup');
    Route::get('signup/activate/{token}', 'AuthController@signupActivate');
    Route::group([
        'middleware' => 'auth:api'
    ], function() {
        Route::get('logout', 'AuthController@logout');
    });
});

Route::group([
    'namespace' => 'Auth',
    'middleware' => 'web',
    'prefix' => 'auth'], function () {
    Route::get('user', 'AuthController@user');
});
0

Aby coś takiego osiągnąć powinieneś utworzyć jeden route (bez middleware auth) i w kontrolerze wołać Auth::check(), aby sprawdzić, czy użytkownik jest zalogowany,

Np.:

class MyController {

  public function index(): array { 
    if (Auth::check()) {
      return [ /* dane dla zalogowanego użytkownika */ ];
    } else {
      return [ /* dane dla niezalogowanego użytkownika */ ];
    }
  }

}
0

Dodałem taki route w web.php, sprawdziłem adres /test, ale pusto. Przeniosłem do api.php i sprawdziłem adres /api/test i to samo.

Route::get('/test', function () {
    return Auth::user();
})->name('test'));

Ale mam już rozwiązanie. W kodzie z tutoriala jest nałożony podwójny middleware - api i auth:api. Ustawiłem dla pożądanego routa sam "auth:api" i jest ok.
Ale fajnie jakby ktoś wytłumaczył dlaczego tak się dzieje

Jednak nie działa. Przy zalogowanym zwraca usera, ale przy niezalogowanym dostaję "message: unathorized", które nie wiem skąd właściwie pochodzi.

Może byłby ktoś w stanie wygenerować prosty projekt z jedną taką ścieżką, z domyślnym passportowym uwierzytelnianiem? Mogę nawet zapłacić.

Nadal nie mogę znaleźć rozwiązania. Czy moje podejście do projektowania API jest jakieś błędne, albo niezgodne z zasadami REST, SOLID itp.?

0

możesz wykorzystać rodzyna z ver. 5.5 auth/guest
https://arjunphp.com/laravel-5-5-new-blade-directives-auth-guest/

1 użytkowników online, w tym zalogowanych: 0, gości: 1