本题目旨在考察解决问题的能力,分为实操与问答两部分。
最终交付时,期望交付一份符合需求、可构建运行的代码,并将问答部分的答案以 markdown 文档形式附在工程目录中交付。
问答部分即使没法给出实现的方案,亦期望看见问题产生的原因、解决问题的思路。只要能提供思路或方案,实现的的代码可以不需给出,或只给出必要部分。
使用 Typescript 实现一个 API 服务器,满足用户注册/登录等基础功能。包含以下接口:
| Method | Path | Description |
|---|---|---|
| POST | /auth/sign-up | 使用用户名和密码注册,注册后返回 Token |
| POST | /auth/sign-in | 使用用户名和密码登录,登录后返回 Token |
| GET | /users/me | 获取当前登录用户的信息 |
| GET | /dashboard | 返回任意 JSON 数据 |
| GET | /users/:username | 根据用户名获取用户信息 |
| PATCH | /users/me/username | 修改当前用户的用户名 |
| PATCH | /users/me/password | 修改当前用户的密码 |
| PUT | /users/me/avatar | 上传头像,详细需求见下文 |
- 使用任意 web 框架实现以上 API;
- 注册用户后,用户信息写入到数据中的 users 表中,且密码不使用明文保存;
- 以 PUT 方式将头像上传到服务器后,将上传条目写入到数据库的 uploads 表,并将该用户的 avatarId 列以外键关联到 uploads 表的 id;
- 使用 SQLite 数据库保存以上两个表的数据;
- 使用任意测试框架为该 API 服务编写测试用例(尽量使用 e2e test),覆盖率要求至少达到50%,测试时需要确实有数据库写入操作,且不受开发数据库的干扰,多次跑 test 的结果保持一致。
- 上传头像这个功能如何防止被恶意利用?
- 部署到服务器后,前端页面请求该项目的接口出现 CORS 错误,应该如何解决?
- 如何防止该 API 服务器的接口被机器人穷举,或被重放攻击?
- 当项目升级需要将该项目从 CommonJS 改成 ES Module 时,该工程的配置和代码应作哪些修改?
- 当删除 uploads 表中某个条目时,该条目作为头像已被现有的 user 引用,导致删除失败。该问题的原因是什么?业务层面该做哪些改动?
- 若该项目希望日后迁移到其他关系型数据库(如 MySQL / PostgresSQL),或者说希望这套代码能同时在 SQLite 或其他数据库上都能跑,那么工程层面应该怎么设计合适?
- 我希望在登录或进行敏感操作时,需要 TOTP 进行二步验证才能进一步操作(即:登录后未经 TOTP 验证只能请求 /users/me,修改用户名/修改密码时必须经过 TOTP 验证才能操作)。应该如何实现?
- 阐述 “使用 Passkey 登录” 的原理和实现思路。