如何在getServerSideProps之外获取cookie



我在getServerSideProps中有这个代码,它为我提供了来自名为token:的cookie的令牌值

const token = context.req.cookies?.token || null;
const auth = true;
//Then I sent the token to server
const settings = {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
'Authorization': "Bearer " + token,
},
body: JSON.stringify({ "limit": "10" })
};

该cookie是我从带有Set-Cookie报头的post请求中接收的httpOnlycookie。

问题是,我希望不仅在页面组件中使用令牌(getServerSideProps仅在页面组件(。在其他组件中,我有时想使用能给我更多数据的函数,比如说客户端的所有消息——基于他的令牌(我在logs.js中将其限制为10,我想在我的内部组件函数中增加它(。通过道具传递令牌,然后在我的函数中使用它安全吗?我有logs.js组件,它有另一个名为Messages的组件,在Messages组件内部,我想调用一个函数来获取更多消息,但我不确定它是否安全,因为在getServerSideProps中获取令牌的想法是没有人能看到它,还是我错了?

如果我没有错的话,从客户端获取令牌以便在内部组件内发送请求的最佳方式是什么?

在getServerSideProps中获取令牌的想法是没有人能看到它

当涉及到cookie时,情况并非如此。Cookie将被发送到浏览器,这样任何人都可以看到它。您在getServerSideProps中对它所做的操作是隐藏的,但cookie本身是可见的。

因为它是httpOnly cookie,所以您无法在客户端上使用javascript访问它。因此,如果你需要javascript中的cookie值,你有几个选项:

  1. 读取getServersideProps中的cookie,并将该值传递到页面和组件。如果您只需要您的组件读取cookie值,这将起作用
  2. 更改为{ httpOnly: false }cookie,这将允许javascript读取(和写入(它。如果这与安全性有关,我不会这么做,因为任何人不仅可以读取cookie,还可以更改它,并对它为所欲为

你提到它是一个代币——最大的问题是:从安全性角度来看,代币是用来做什么的?您提到使用它来确定您是否应该拥有10个以上的日志。这是业务要求吗?如果有人操纵它显示20、30、1000,会发生不好的事情吗(比如你赔钱、违约等?(?

如果您的业务只需要向用户显示10,除非他/她的令牌增加了该限制,并且您不希望用户操纵该限制,请将其保留为httpOnly,在getServerSideProps中读取,然后将数字传递给您的组件。然后,任何东西都不能被操纵或更改,因为客户端不能篡改令牌来解锁更多日志。

最新更新