Laravel Sanctum ile bu hatayı alıyordum. Kernel.php'deki ara yazılım grubuna ekleyerek \Illuminate\Session\Middleware\StartSession::class,bunu apidüzelttim, ancak daha sonra bunun "işe yaradığını" anladım çünkü kimlik doğrulama yollarım api.phpyerine eklendiweb.php laravel yanlış yetkilendirme görevlisi kullanıyordum yüzden.
Bu rotaları buraya taşıdım web.phpve sonra AuthenticatesUsers.phpözellik ile düzgün bir şekilde çalışmaya başladılar :
Route::group(['middleware' => ['guest', 'throttle:10,5']], function () {
Route::post('register', 'Auth\RegisterController@register')->name('register');
Route::post('login', 'Auth\LoginController@login')->name('login');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
Route::post('email/verify/{user}', 'Auth\VerificationController@verify')->name('verification.verify');
Route::post('email/resend', 'Auth\VerificationController@resend');
Route::post('oauth/{driver}', 'Auth\OAuthController@redirectToProvider')->name('oauth.redirect');
Route::get('oauth/{driver}/callback', 'Auth\OAuthController@handleProviderCallback')->name('oauth.callback');
});
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
Hakkında garip bir hata daha aldım sonra sorunu çözdüm RequestGuard::logout() .
Özel kimlik doğrulama yollarımın AuthenticatesUsers özelliğinden yöntemler çağırdığını fark etmemi sağladı, ancak bunu Auth::routes()başarmak için kullanmıyordum . Sonra Laravel'in varsayılan olarak web korumasını kullandığını fark ettim ve bu, rotalarınroutes/web.php .
Sanctum ve ayrıştırılmış bir Vue SPA uygulamasıyla ayarlarım şimdi şöyle görünüyor:
Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
EnsureFrontendRequestsAreStateful::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
'throttle:60,1',
],
];
Not: Laravel Sanctum ve aynı alan adına sahip Vue SPA ile oturum tanımlama bilgisi için httpOnly tanımlama bilgilerini kullanırsınız ve beni hatırla tanımlama bilgisini ve CSRF için güvenli olmayan tanımlama bilgisini kullanırsınız, bu nedenle webkorumayı yetkilendirme için kullanırsınız ve diğer tüm korumalı, JSON döndürme rotalarını kullanmalısınız. auth:sanctumara yazılım.
config / auth.php
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
...
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
Sonra böyle kritik, bu nereye olarak birim testleri olabilir Auth::check(), Auth::user()ve Auth::logout()çalışma olarak Asgari yapılandırma ve maksimum kullanımı ile beklenen AuthenticatesUsersve RegistersUsersözellikleri.
İşte giriş birimi testlerimden birkaçı:
TestCase.php
/**
* Creates and/or returns the designated regular user for unit testing
*
* @return \App\User
*/
public function user() : User
{
$user = User::query()->firstWhere('email', 'test-user@example.com');
if ($user) {
return $user;
}
// User::generate() is just a wrapper around User::create()
$user = User::generate('Test User', 'test-user@example.com', self::AUTH_PASSWORD);
return $user;
}
/**
* Resets AuthManager state by logging out the user from all auth guards.
* This is used between unit tests to wipe cached auth state.
*
* @param array $guards
* @return void
*/
protected function resetAuth(array $guards = null) : void
{
$guards = $guards ?: array_keys(config('auth.guards'));
foreach ($guards as $guard) {
$guard = $this->app['auth']->guard($guard);
if ($guard instanceof SessionGuard) {
$guard->logout();
}
}
$protectedProperty = new \ReflectionProperty($this->app['auth'], 'guards');
$protectedProperty->setAccessible(true);
$protectedProperty->setValue($this->app['auth'], []);
}
LoginTest.php
protected $auth_guard = 'web';
/** @test */
public function it_can_login()
{
$user = $this->user();
$this->postJson(route('login'), ['email' => $user->email, 'password' => TestCase::AUTH_PASSWORD])
->assertStatus(200)
->assertJsonStructure([
'user' => [
...expectedUserFields,
],
]);
$this->assertEquals(Auth::check(), true);
$this->assertEquals(Auth::user()->email, $user->email);
$this->assertAuthenticated($this->auth_guard);
$this->assertAuthenticatedAs($user, $this->auth_guard);
$this->resetAuth();
}
/** @test */
public function it_can_logout()
{
$this->actingAs($this->user())
->postJson(route('logout'))
->assertStatus(204);
$this->assertGuest($this->auth_guard);
$this->resetAuth();
}
Laravel kimlik doğrulama özelliklerinde registeredve authenticatedyöntemlerini geçersiz kıldım, böylece yalnızca 204 SEÇENEK yerine kullanıcı nesnesini döndürdüler:
public function authenticated(Request $request, User $user)
{
return response()->json([
'user' => $user,
]);
}
protected function registered(Request $request, User $user)
{
return response()->json([
'user' => $user,
]);
}
Yetkilendirme özellikleri için satıcı koduna bakın. Bunları el değmeden ve ayrıca yukarıdaki iki yöntemi kullanabilirsiniz.
- vendor / laravel / ui / auth-backend / RegistersUsers.php
- vendor / laravel / ui / auth-arka uç / AuthenticatesUsers.php
İşte benim Vue SPA'mın giriş için Vuex eylemleri:
async login({ commit }, credentials) {
try {
const { data } = await axios.post(route('login'), {
...credentials,
remember: credentials.remember || undefined,
});
commit(FETCH_USER_SUCCESS, { user: data.user });
commit(LOGIN);
return commit(CLEAR_INTENDED_URL);
} catch (err) {
commit(LOGOUT);
throw new Error(`auth/login# Problem logging user in: ${err}.`);
}
},
async logout({ commit }) {
try {
await axios.post(route('logout'));
return commit(LOGOUT);
} catch (err) {
commit(LOGOUT);
throw new Error(`auth/logout# Problem logging user out: ${err}.`);
}
},
Laravel Sanctum + aynı alanlı Vue SPA + kimlik doğrulama ünitesi testlerini standartıma uygun şekilde çalıştırmam bir haftadan fazla sürdü, bu yüzden umarım buradaki cevabım gelecekte başkalarına zaman kazandırabilir.