我正在开发一个网站,使用laravel作为我的API,并使用nextjs作为我的前端。当一个用户登录时,我向我的laravel API发布一个帖子,以便对他进行身份验证。如果成功,我将返回一个httponly cookie以及包含auth令牌的响应。登录后,我想导航到主页的用户。我为getServerSideProps创建了一个 Package 器函数,以便每个需要检查auth的页面都可以使用该函数进行检查,如果令牌不在cookie中或过期,则重定向到登录页面。在这个 Package 器函数中,我试图获取req.headers.cookie,但是我得到了undefined。
这是我的Laravel端点:
public function login(Request $request)
{
$validator = Validator::make($request->all(), [
'username' => 'required|string',
'password' => 'required|string',
'rememberMe' => 'boolean|required'
]);
if ($validator->fails()) {
return response()->json($validator->errors(), Response::HTTP_UNPROCESSABLE_ENTITY);
}
$loginData = $validator->validated();
$credentials = $loginData;
unset($credentials['rememberMe']);
$usersModel = new Users();
$user = $usersModel->get_user_by_credentials($credentials);
if (!$user) {
return response()->json(['error' => 'Unauthorized', 'msg' => l('LOGIN__incorrect_details', 'login_lang')], Response::HTTP_UNAUTHORIZED);
}
if (empty($user['status']) || $user['status'] != '1') {
return response()->json(['error' => 'Not Active', 'msg' => l('LOGIN__account_suspended', 'login_lang')], Response::HTTP_UNAUTHORIZED);
}
$token = auth()->login($user);
$response = $this->createNewToken($token);
$cookie = Cookie::make('auth', $token, $loginData['rememberMe'] ? env('REMEMBER_ME_TTL', 525600) : env('JWT_TTL', 60), null, null, App::environment('production'), true, false, App::environment('production') ? 'none' : null);
return $response->withCookie($cookie);
}
这是我的withAuth Package 器函数,也是主页的一个示例:
import { GetServerSidePropsContext } from 'next';
import { ParsedUrlQuery } from 'querystring';
export function withAuth(
gssp: (context: GetServerSidePropsContext<ParsedUrlQuery>) => Promise<any> = async () => { return { props: {} } }
) {
return async function (context: GetServerSidePropsContext<ParsedUrlQuery>) {
const { req } = context;
console.log('req.headers.cookie', req.headers.cookie); // undefined
return await gssp(context);
}
}
import { withAuth } from "@/lib/with-auth";
export const getServerSideProps = withAuth();
export default function Home() {
return (
<></>
);
}
我试着将cookie的samesite值设置为none和null,没有任何变化。
所有这些都只在开发环境中进行了测试。如果有人知道我如何在getServerSideProps中获得auth令牌以验证用户,那将是惊人的。
1条答案
按热度按时间zsbz8rwp1#
经过几个小时的尝试,在发布问题几分钟后,我找到了答案。解决这个问题的办法是我没有在axios请求中使用
{withCredentials: true}
。