我正在编写一个通过抓取外部域来构建API的应用程序。为了刮取域名,我的服务器必须经过授权(使用会话cookie)。
我正在使用带有cookie jar的request module来维护请求中的cookie。
我想设置一些Node路由器中间件,这样,如果/当会话到期时,我可以重新运行我的身份验证方法。想想这样的事情:
export function validate(req, res, next) {
const cookie = cookieJar.getCookie('**target domain**');
const COOKIE_IS_EXPIRED = // ???
if ( COOKIE_IS_EXPIRED ) {
authenticate().then(next);
} else {
next();
}
}
当我退出cookieJar.getCookies()
的内容时,我的结果如下:
[ Cookie="lw_opac_1=1483019929431275955; Expires=Wed, 29 Mar 2017 13:58:49 GMT; Max-Age=7776000; Path=/opac; hostOnly=true; aAge=0ms; cAge=6345ms",
Cookie="lw_opac=ta4tscsejs6c94ngikt7hlbcn0; Path=/; hostOnly=true; aAge=0ms; cAge=6347ms" ]
如何验证两个cookie何时接近/已过期,然后重新运行我的auth功能?
谢谢!
答案 0 :(得分:1)
您可以使用npm中的cookie
模块来解析cookie。
所以,例如当你有一个像你发布的字符串时:
var c = "lw_opac_1=1483019929431275955; Expires=Wed, 29 Mar 2017 13:58:49 GMT; Max-Age=7776000; Path=/opac; hostOnly=true; aAge=0ms; cAge=6345ms";
然后运行:
console.log(cookie.parse(c));
将导致打印:
{ lw_opac_1: '1483019929431275955',
Expires: 'Wed, 29 Mar 2017 13:58:49 GMT',
'Max-Age': '7776000',
Path: '/opac',
hostOnly: 'true',
aAge: '0ms',
cAge: '6345ms' }
您可以使用Max-Age
和Expires
字段,并使用moment
对其进行解析,并将其与当前时间进行比较。
使用moment
,您可以将给定日期与今天进行比较,并获得差异的小时数或天数。例如:
moment().isAfter(someDate);
会告诉您该日期是否已经过去(如果它已过期,那么它会告诉您该Cookie是否已过期)。
请参阅:
答案 1 :(得分:0)
@rsp回答正确。但是,如果要维护访问安全性令牌,则应继续使用csrf令牌,该令牌会自动维护客户端cookie并为新会话生成令牌。有关详细信息http://www.senchalabs.org/connect/csrf.html