Time's Based Public Access for the Route in a Next.js App TL; DR:我增加了一个时间门,让任何人在早上9点6分之间/下午9点之间在没有会话饼干的情况下撞击。
在该窗口外,请求会回到普通的认证中间软件。
这种变化存在于并需要适当的时区处理和对认证流量的微小的重构。 "问题我们的电视仪表板()"意在办公室大厅的墙上显示.
屏幕在办公时间应可被任何人看到,但必须在数小时后受到保护。
原中件 () 在所有路线上强制使用会话 cookie (), 包括 .
结果是,下午6时后大厅屏幕上播放了 " 未经批准 " 的一通 " 4 001 " ,打破了预期的用户体验。
症状很简单: 出错出自盲目将未经认证的请求重定向到登录页面的认证中间软件.
我们需要一个有条件的绕行,这个绕行只适用于路径,并且只在确定的营业时间。
我第一次尝试的本能是在中间软件的上方加一个快活.
这让请求通过,但同时也打开了全天的路线,忽略了时间限制.
我试图读取服务器本地时间(), 结果是,路线要么总是开放的,要么总是封闭的,这取决于CI跑者的位置。
我考虑使用第三方图书馆, 执行1.
增加一个微小的窗口帮助器。
它收到一个起始小时,一个结束小时,以及一个时区标识符,然后返回一个布尔来表示当前时刻是否落在该窗口内.
我选择这样做,因为它是一种轻而易举的、可摇动的处理时区的方法,而不必花太多时间。
功能是刻意纯洁的,便于单位测试.
2.
扩展认证流 现有函数没有受到影响,但我增加了一个评论块,以说明变化的临时性质(见diff)。
真正的工作发生在.
关键点:先检查路径- 通过处理任何饼干逻辑之前的快捷键,我们避免不必要的同步工作.
时间窗口 — — 完全符合要求: 包含上午9点, 不包括下午6点。
Fallback — — 在窗口外, 请求通过正常的令牌验证进行, 维护小时后的安全 。
3.
根据完整性调整diff 承诺 diff 仅显示在 .
我把它扩展到上面的帮助者功能。
中间软件 diff 添加了导入和条件块 。
最后的diff看起来像这样:
4.
测试本地 我加了一个快速单元测试: