ToC
前言
大家好,好久(一会)不见,我是某昨。
最近把博客进行迁移的过程中,个人体感最明显的缺失功能就是密码。对于时不时会逆向一些专有软件的我而言,有些东西是不大适合公开可访问的。Wordpress
的密码功能很好地解决了这个问题,但在静态博客生成工具中我一直没有找到很好的解决方案。
理论上,实现某篇博客文章的密码保护可以有以下两种方式:
- 一种是在运行时有一个简单的后端服务,负责校验密码、返回文章内容
- 一种是在构建时对文章进行对称/非对称加密,然后在前端解密
我选择了第二种,因为第二种的部署方式能够 100%
静态化,架构上也相比前者简单不少。
定义一个密码
首先,我们需要定义一个密码。我选择在 frontmatter
区域增加一个 password
字段:
这样就可以在 Markdown
的首部定义密码了,就像这样:
加密与解密
要回答加密和解密的问题,我们首先需要理清楚需要解决的问题:
- 如何获取待加密的文本?
- 如何加密?
- 用户如何输入密码?
- 如何解密?
- 解密后如何展示?
一项项看,首先是加密的文本。在咕老师的帮助下,我们在 Stackoverflow 上发现可以通过 slot.render()
的方式拿到 HTML
文本:
使用的时候只要把希望加密的组件放到这个 Wrapper
的里面就可以了:
拿到待加密的文本之后,第二个问题是如何加密。我们选择通过 AES-256-CBC
简单加密一下:
这里基本都是用了 WebCrypto
,只在 Buffer
的部分偷了一下懒x
加密完成之后就是用户界面了,在副驾驶的帮助下搓了个姑且能看的:
再搓一个配套的解密,但这里就不能用 Buffer
了,需要纯浏览器端可用,最后把代码串起来:
这里值得注意的是 [1]
和 [2]
的部分。由于 Astro
的 View Transition
机制,不能保证脚本的执行。因此需要通过 event
的方式手动在页面变换的时候加上 Listener
。
套壳,启动!
完成了加密组件,接下来就要给我们有密码的文章套上这个加密的壳了。我们先弄个简单的 Wrapper
,方便我们套:
然后在合适的地方把 PasswordWrapper
塞进去:
就大功告成啦!
体验一下?
最终的成品在这里。你可以尝试输入密码(test
),解密后的内容渲染应该是可以正常工作的。
关于未来
最主要的有/无问题已经解决,接下来就是体验优化的部分了。简单列了一下可以优化的点:
嘛,就是这样x