diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c856afd..c5d3418c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,17 @@ ## main(v0.7.0) +### Breaking Changes + +DB changes: 增加用户 `passkey` 表, 需要执行 `db/2024-08-10-patch.sql` 更新 `D1` 数据库 + +### Changes + - Docs: Update new-address-api.md (#360) - feat: worker 增加 `ADMIN_USER_ROLE` 配置, 用于配置管理员用户角色,此角色的用户可访问 admin 管理页面 (#363) - feat: worker 增加 `DISABLE_SHOW_GITHUB` 配置, 用于配置是否显示 github 链接 - feat: worker 增加 `NO_LIMIT_SEND_ROLE` 配置, 用于配置可以无限发送邮件的角色 +- feat: 用户增加 `passkey` 登录方式, 用于用户登录, 无需输入密码 ## v0.6.1 diff --git a/db/2024-08-10-patch.sql b/db/2024-08-10-patch.sql new file mode 100644 index 00000000..38a12418 --- /dev/null +++ b/db/2024-08-10-patch.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS user_passkeys ( + id INTEGER PRIMARY KEY, + user_id INTEGER NOT NULL, + passkey_name TEXT NOT NULL, + passkey_id TEXT NOT NULL, + passkey TEXT NOT NULL, + counter INTEGER DEFAULT 0, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_user_passkeys_user_id ON user_passkeys(user_id); + +CREATE UNIQUE INDEX IF NOT EXISTS idx_user_passkeys_user_id_passkey_id ON user_passkeys(user_id, passkey_id); diff --git a/db/schema.sql b/db/schema.sql index bc655935..5967627e 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -88,3 +88,18 @@ CREATE TABLE IF NOT EXISTS user_roles ( ); CREATE INDEX IF NOT EXISTS idx_user_roles_user_id ON user_roles(user_id); + +CREATE TABLE IF NOT EXISTS user_passkeys ( + id INTEGER PRIMARY KEY, + user_id INTEGER NOT NULL, + passkey_name TEXT NOT NULL, + passkey_id TEXT NOT NULL, + passkey TEXT NOT NULL, + counter INTEGER DEFAULT 0, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_user_passkeys_user_id ON user_passkeys(user_id); + +CREATE UNIQUE INDEX IF NOT EXISTS idx_user_passkeys_user_id_passkey_id ON user_passkeys(user_id, passkey_id); diff --git a/frontend/package.json b/frontend/package.json index dded1e25..0d3b3b4c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -17,6 +17,7 @@ "deploy:actions": "npm run build && wrangler pages deploy ./dist" }, "dependencies": { + "@simplewebauthn/browser": "^10.0.0", "@unhead/vue": "^1.9.15", "@vicons/material": "^0.12.0", "@vueuse/core": "^10.11.0", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index f8c4fe17..26bbc9c1 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@simplewebauthn/browser': + specifier: ^10.0.0 + version: 10.0.0 '@unhead/vue': specifier: ^1.9.15 version: 1.9.15(vue@3.4.31(typescript@5.4.5)) @@ -1188,6 +1191,12 @@ packages: cpu: [x64] os: [win32] + '@simplewebauthn/browser@10.0.0': + resolution: {integrity: sha512-hG0JMZD+LiLUbpQcAjS4d+t4gbprE/dLYop/CkE01ugU/9sKXflxV5s0DRjdz3uNMFecatRfb4ZLG3XvF8m5zg==} + + '@simplewebauthn/types@10.0.0': + resolution: {integrity: sha512-SFXke7xkgPRowY2E+8djKbdEznTVnD5R6GO7GPTthpHrokLvNKw8C3lFZypTxLI7KkCfGPfhtqB3d7OVGGa9jQ==} + '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} @@ -4075,6 +4084,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true + '@simplewebauthn/browser@10.0.0': + dependencies: + '@simplewebauthn/types': 10.0.0 + + '@simplewebauthn/types@10.0.0': {} + '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: ejs: 3.1.10 diff --git a/frontend/src/views/user/UserLogin.vue b/frontend/src/views/user/UserLogin.vue index 60c0665d..68118c35 100644 --- a/frontend/src/views/user/UserLogin.vue +++ b/frontend/src/views/user/UserLogin.vue @@ -1,18 +1,17 @@