লারাভেল অভয়ারণ্যের সাথে আমি এই ত্রুটিটি পাচ্ছিলাম। আমি কার্নেল.এফপি- \Illuminate\Session\Middleware\StartSession::class,র apiমিডলওয়্যার গ্রুপে যুক্ত করে এটি ঠিক করেছি , তবে পরে আমি এই "কাজ" পেয়েছি কারণ আমার প্রমাণীকরণের রুটের api.phpপরিবর্তে যুক্ত করা হয়েছিল web.php, তাই লারাভেল ভুল লেখক প্রহরীটি ব্যবহার করছিল।
আমি এই রুটগুলি এখানে সরিয়ে নিয়েছি web.php এবং তারপরে তারা AuthenticatesUsers.phpবৈশিষ্ট্যের সাথে সঠিকভাবে কাজ শুরু করে:
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');
আমার কাছে আরও একটি অদ্ভুত ত্রুটি থাকার পরে আমি সমস্যাটি বের করেছিলাম RequestGuard::logout()।
এটি আমাকে উপলব্ধি করে তোলে যে আমার কাস্টম এথ রুটগুলি প্রমাণীকরণের ব্যবহারকারীদের বৈশিষ্ট্য থেকে কলগুলি পদ্ধতিগুলিকে কল করছে তবে আমি Auth::routes()এটি সম্পাদন করতে ব্যবহার করছি না। তখন আমি বুঝতে পেরেছি লারাভেল ডিফল্টরূপে ওয়েব গার্ড ব্যবহার করে এবং এর অর্থ রুটগুলি অবশ্যই হওয়া উচিত routes/web.php।
স্যাঙ্কটাম এবং একটি ডিকোপলড ভ্যূ এসপিএ অ্যাপ্লিকেশনটির সাথে আমার সেটিংস এখন দেখতে দেখতে এটি:
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',
],
];
দ্রষ্টব্য: লারাভেল সান্টাম এবং একই ডোমেন ভ্যূ এসপিএর সাহায্যে আপনি সেশন কুকির জন্য কেবলমাত্র কুকি ব্যবহার করেন এবং সিএসআরএফ-এর জন্য অনিরাপত্ত কুকি মনে webরাখেন , সুতরাং আপনি রক্ষীর জন্য প্রহরীটি ব্যবহার করুন এবং অন্য সমস্ত সুরক্ষিত, জেএসওএন-ফেরত রুট ব্যবহার করা উচিত auth:sanctumমিডলওয়্যার।
কনফিগ / auth.php
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
...
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
তারপর আপনি এই ধরনের এই, যেখানে সমালোচকদের, যেমন ইউনিট পরীক্ষা থাকতে পারে Auth::check(), Auth::user()এবং Auth::logout()সংক্ষিপ্ত কনফিগ এবং সর্বোচ্চ ব্যবহারের সঙ্গে প্রত্যাশিত কাজ হিসাবে AuthenticatesUsersএবংRegistersUsers বৈশিষ্ট্যগুলো।
এখানে আমার লগইন ইউনিট পরীক্ষাগুলির কয়েকটি রয়েছে:
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();
}
আমি লারাভেল প্রমাণীকরণের বৈশিষ্ট্যগুলিতে registeredও authenticatedপদ্ধতিগুলিকে ওভাররাইড করেছিলাম যাতে তারা কেবলমাত্র 204 বিকল্পগুলির পরিবর্তে ব্যবহারকারী অবজেক্টটি ফিরিয়ে দেয়:
public function authenticated(Request $request, User $user)
{
return response()->json([
'user' => $user,
]);
}
protected function registered(Request $request, User $user)
{
return response()->json([
'user' => $user,
]);
}
লেখক বৈশিষ্ট্যের জন্য বিক্রেতা কোডটি দেখুন। আপনি এগুলিকে অপছন্দ করতে পারেন, এবং উপরোক্ত দুটি পদ্ধতি ব্যবহার করতে পারেন।
- বিক্রেতা / Laravel / UI / প্রমাণীকরণ-ব্যাকএন্ড / RegistersUsers.php
- বিক্রেতা / Laravel / UI / প্রমাণীকরণ-ব্যাকএন্ড / AuthenticatesUsers.php
লগইন করার জন্য এখানে আমার ভ্যূ এসপিএর ভিউক্স ক্রিয়া রয়েছে:
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}.`);
}
},
লারাভেল সেন্টটাম + একই-ডোমেন ভ্যূ এসপিএ + লেখক ইউনিটটি আমার মান অনুসারে কাজ করার জন্য এক সপ্তাহের বেশি সময় নিয়েছে, তাই আশা করি এখানে আমার উত্তরটি ভবিষ্যতে অন্যদের সময় বাঁচাতে সহায়তা করতে পারে।