我正在尝试使用下一个身份验证中的 SessionProvider,如下所示:
"use client";
import { SessionProvider } from "next-auth/react";
export function MySessionProvider({ children, session }) {
return (
<SessionProvider session={session}>
{children}
</SessionProvider>
);
};
然后我在主布局中使用它。
在幕后 SessionProvider 向 /api/auth/session 发出 GET 请求。 我在文档中找不到如何调整客户端此类请求的行为。
我确实需要向该请求附加一个额外的 HTTP 标头。我正在尝试发送实际的设备指纹以在我的会话 API 中进行自定义检查。
好吧,我决定只编写自己的上下文提供程序而不是 SessionProvider:
"use client";
import { createContext, useContext, useState, useEffect } from "react";
import { useFetchGet } from "@hooks/frontendRequests";
import projectPaths from "@utils/projectPaths";
const UserContext = createContext("");
export function UserContextProvider({ children }) {
const [user, setUser] = useState({});
const fetchResult = useFetchGet(projectPaths.API_USERS + "/self");
useEffect(() => {
if (fetchResult.user) {
setUser(fetchResult.user);
}
}, [fetchResult]);
return (
<UserContext.Provider value={{ user, setUser }}>
{children}
</UserContext.Provider>
);
}
export function useUserContext() {
const context = useContext(UserContext);
if (!context) {
throw new Error("useUserContext must be used within UserContextProvider.");
}
return context;
}
useFetchGet
设置所有必要的标头,我的自定义 API 端点不仅检查会话,还会在成功时返回有用的负载。
如果会话出现问题,服务器将返回错误 401,我的前端 useFetchGet
功能将通过在客户端重新路由来处理它。