লারাভেল অভয়ারণ্যের সাথে আমি এই ত্রুটিটি পাচ্ছিলাম। আমি কার্নেল.এফপি- \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}.`);
}
},
লারাভেল সেন্টটাম + একই-ডোমেন ভ্যূ এসপিএ + লেখক ইউনিটটি আমার মান অনুসারে কাজ করার জন্য এক সপ্তাহের বেশি সময় নিয়েছে, তাই আশা করি এখানে আমার উত্তরটি ভবিষ্যতে অন্যদের সময় বাঁচাতে সহায়তা করতে পারে।