背景
Cloudflare是一个著名的网络服务,不仅仅提供域名、CDN等服务,它还提供了非常适合中小型网站的全栈实现方案,而且价格也很美丽,大部分情况下,包含了前端后端的网站托管你可以免费拥有。
Cloudflare的全栈方案主要落地于Javascript,也就是说前端和后端都使用Javascript语言,当然其他语言也在跟进中,请读者随时关注cloudflare官网。
基础
在Cloudflare的全栈方案中,Workers(https://workers.cloudflare.com/)是属于后端的方案 ,通常用来实现API接口,API代理,甚至支付接入等等,与之对应的Pages(https://pages.cloudflare.com/)则是属于前端方案,拥有host静态页面,包括前端框架(React,vue,等)生成的静态页面。
出于降低系统复杂度的考虑,Cloudflare在Pages方案中包含了一个Functions(https://developers.cloudflare.com/pages/functions/)方案,Functions类似于Workers,可以理解为一个轻量级的Workers,它也提供API接口,API代理等功能,具体的功能请参考上述页面。
问题
我之前在实现一个带用户登录的网站时,我使用React+Pages+Functions快速搭建,需要一种jwt的实现,在尝试了npm i jsonwebtoken
之后发现行不通,因为jsonwebtoken依赖crypto库,而crypto库无法包含在pages部署环境里,因为crypto库是系统库。
解决方案
我知道Firebase,supabase这类的后端服务默认支持auth服务,但是如果要切换过去的话,对我的项目来说有点划不来,所以我找到了jose库, 我的需求很简单,1)签名,2)验证。
本文中不描述token的更新机制,请感兴趣的朋友自行查看Pages KV文档,也都是现成的内存key-value数据库。
生成token
不废话,直接上代码
稍微解释一下
secret通常应该保存在server端,而functions属于server端的部署方式,所以也是没问题的。
SignJWT的第一个参数是payload,即需要被签名的内容
alg就按我的写
验证token
验证是签名的逆过程,此刻我们就得到了原始的payload,并且也有expireatoin的时间戳,如果当前时间大于该时间戳,则token过期。