Я использую пароль для аутентификации пользователя, и после каждой аутентификации я назначаю защищенного повара ie, который хранит токен паспорта. Я могу успешно пройти аутентификацию с использованием метода Auth::attempt()
, но Auth::user()
имеет значение null. Даже в том же контроллере для метода logout () пользователь не определен, и я не могу даже Auth::logout()
.
Метод входа:
public function login(Request $request)
{
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string',
]);
$credentials = \request(['email', 'password']);
if (Auth::attempt($credentials)) {
$user = Auth::user();
$token = $user->createToken('Personal Access Token')->accessToken;
$cookie = $this->getSessionCookie($token);
return response()
->json([
'user' => $user,
'token' => $token,
], 200)
->cookie(
$cookie['name'],
$cookie['value'],
$cookie['minutes'],
$cookie['path'],
$cookie['domain'],
$cookie['secure'],
$cookie['httponly'],
$cookie['samesite']
);
} else {
return response()->json([
'error' => 'Invalid Credentials',
], 422);
}
}
Метод выхода из системы:
public function logout(Request $request)
{
$request->user()->token()->each(function ($token, $key) {
$token->delete();
});
$cookie = \Cookie::forget('auth_token');
Auth::logout();
return response()->json([
'message' => 'Logged out successfully.'
], 200)->withCookie($cookie);
}
Здесь Auth::logout()
производит Method Illuminate\Auth\RequestGuard::logout does not exist.
В противном случае выход из системы будет успешным.
Мои маршруты API:
Route::group(['prefix' => 'v1'], function() {
// Authentication
Route::post('/login', 'AuthController@login');
Route::post('/register', 'AuthController@register');
Route::post('/password/reset', 'AuthController@sendPasswordResetLink');
Route::post('/password/update', 'AuthController@callResetPassword');
// Articles
Route::get('/articles', 'ArticleController@index');
Route::middleware(['auth.header', 'auth:api'])->group(function () {
// Get Logged in User
Route::get('/user', function (Request $request) {
return $request->user(); // returns the actual logged in user
});
// Articles
Route::post('/articles', 'ArticleController@store');
Route::get('/articles/{id}', 'ArticleController@show');
Route::put('/articles/{id}', 'ArticleController@update');
Route::delete('/articles/{id}', 'ArticleController@destroy');
// Log Out
Route::post('/logout', 'AuthController@logout');
});
});
Пример контроллера, где Auth::user()
равен нулю:
class ArticleController extends Controller
{
public function index(Request $request)
{
$user = \auth()->user(); // null
$user = Auth::user(); // null
$user = $request->user(); // null
}
}
В методе index я знаю, почему пользователь имеет значение null, поскольку маршрут не заключен в промежуточное ПО auth:api
, но как мне получить аутентификационного пользователя в этом методе, даже если он не требуется.
Я уверен, что что-то упустил, но я не знаю что. Я буду рад предоставить больше кода.
РЕДАКТИРОВАТЬ: Мой auth.api
промежуточное программное обеспечение:
class AuthenticationHeader
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!$request->bearerToken()) {
if ($request->hasCookie('auth_token')) {
$token = $request->cookie('auth_token');
$request->headers->add(['Authorization' => 'Bearer ' . $token]);
}
}
return $next($request);
}
}