前言 #
由于本人非常讨厌输密码登录,所以有用 passkey(实体密钥)直接登录长毛象的想法。但是长毛象本体无法直接通过 passkey 登录,只能用在两步验证。所以选择使用自建 OIDC 服务进行外部登录。在这里要感谢(没有经过授权就不放 ID 了)提供的思路。
选择OIDC 服务 #
目前可选项还是很多的,一般来讲使用云服务就可以了。但是我稍微有点数据洁癖且害怕云服务宕机,于是选择了自建服务。自部署 OIDC 也有非常多的方案。我认为 PocketID 也许不是最好的,但是部署简单,操作简单,界面优美可以我的满足需求。==需要注意的是这个项目没有经过专业安全审计机构,并不清楚是否会被攻破==
假如各位知道 PocketID 有什么已知的安全性 bug,请联系我!
部署 #
选择 PocketID 的一大原因就是这个项目极易部署。几乎不用更改配置文件。开发者文档也写的很明确,可以完全参照开发者文档走。在这里说一下我的方案:我的 PocketID 和毛象跑在一个服务器上,nginx 和 SSL 设置则是参照长毛象的文档配置。PocketID 在 docker 容器中运行。
具体的部署步骤我就省略了,因为没有踩到坑。
与长毛象配合 #
这里就是本次折腾最麻烦且痛苦的时候了,由于未知原因,PocketID 在认证的时候不会给长毛象返回 user_id,而是返回一个 UUID。并不清楚这是 PocketID 的 bug 还是我设置的问题。而这个 UUID 并不能在 PocketID 中直接查看。据我所知唯一的查看方法是在 data 目录中查看用户上传的头像,那个头像的命名包含 UUID。其实进入数据库应该也能看到,但是这些方案都太麻烦了。
所以本次折腾采用的方法是 email 认证。
优点:这个字段可以由用户在 PocketID 中自行填写,可以在一定程度上代替 user_id。不需要找各种奇怪的方式获取 UUID。
缺点:如果用户更改了 PocketID 中的 email,需要重新手动进入长毛象数据库中进行更新。
具体实现方法 #
首先进入长毛象的配置文件,开启 OIDC 登录。这一步要注意安全,有一些选项可能导致账号被有心人盗取。然后进入数据库将 user_id 和认证邮箱绑定。
写到这里突然发现,管理员可以通过此方法访问所有人的账号。甚至只有账号密码的实例上,数据库拥有者也可以这样做。有点吓人了,这就意味着在特定站点上注册,发布消息并不安全,需要完全信任服务器拥有者。
搜索后发现目前普通用户==没有方法防范==。==这不是在贩卖焦虑,但如果你的账号有非常重要的信息,请自建服务。不要信任任何站点。==