Nextjs:无法使用Laravel在getServerSideProps中获取httponly cookie

nle07wnf  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(171)

我正在开发一个网站,使用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令牌以验证用户,那将是惊人的。

zsbz8rwp

zsbz8rwp1#

经过几个小时的尝试,在发布问题几分钟后,我找到了答案。解决这个问题的办法是我没有在axios请求中使用{withCredentials: true}

相关问题