【发布时间】:2021-02-21 21:39:25
【问题描述】:
当您从 React 中的 HttpOnly cookie 获取令牌时,处理用户会话的最佳做法是什么?
我的登录端点如下所示,您可以看到令牌设置在 cookie 上:
@Post('login')
@HttpCode(HttpStatus.OK)
async login(@Ip() ipAddress, @Request() req, @Res() res: Response) {
const auth = await this.basicAuthService.login(req.user, ipAddress);
const cookieOptions = setTokenCookie();
res.cookie('token', auth.token, { httpOnly: true });
res.cookie('refreshToken', auth.refreshToken, { httpOnly: true });
res.send(auth);
}
我还有另一个端点解码令牌以获取用户数据
@Get('user-data')
async getTokenPayload(@Request() req) {
if (!('token' in req.cookies)) {
throw new HttpException('Token was not provided', HttpStatus.NOT_FOUND);
}
const { token } = req.cookies;
return this.basicAuthService.getTokenPayload(token);
}
在前端,我像这样使用来自 React 的 API 上下文,如您所见,我正在从 /user-data 端点获取数据:
export const UserContext = createContext<UserContextState>(userContextValue);
export const UserProvider:FC<UserProviderProps> = ({ children }) => {
const [user, setUser] = useState<User>(userInitialValue);
useEffect(() => {
const getData = async () => {
const tokenDecoded = await getUserData();
setUser(tokenDecoded.user);
};
getData();
}, []);
return (
<UserContext.Provider value={{ user, setUser }}>
{ children }
</UserContext.Provider>
);
};
一切正常,问题是每次浏览器刷新时都会发出请求,以获取用户数据并将其设置为反应状态。我不确定这是否是一个好习惯,因为有时用户没有经过身份验证,显然/user-data 请求会返回错误。我不想将令牌存储在 localStorage 上或将 HttpOnly 设置为 false。有更好的方法吗?
【问题讨论】:
-
当你说它正在工作时,cookie 会在你的 React 应用程序中设置并标记为 httpOnly?
-
否,cookie 在浏览器中设置并标记为 httpOnly。为了从该 cookie 中获取数据,我在后端创建了一个新端点来对其进行解码,cookie 在请求中发送,响应是用户数据,并且我将响应设置为 React 状态。
-
您是否使用 NodeJS 来制作此服务器端 cookie?
-
是的,使用nest.js作为BE
标签: reactjs security authentication jwt-auth