Thư viện Passkey/WebAuthn tốt nhất cho Node.js năm 2026
SimpleWebAuthn dẫn đầu trên mọi chỉ số — 803K lượt tải hàng tuần, đạt chuẩn FIDO, TypeScript native. Cài cái gì và khi nào nên chọn thứ khác.
Bởi Ethan
1.860 từ · 10 phút đọc
SimpleWebAuthn là lựa chọn đúng cho hầu hết tích hợp passkey trên Node.js. Thư viện đạt 803K lượt tải npm mỗi tuần, vượt qua bộ kiểm thử FIDO Alliance conformance, và ra đời với TypeScript native trên Node, Deno, Bun và Cloudflare Workers. Không có thư viện nào trong bảng so sánh này đến gần.
Có hai trường hợp bạn sẽ chọn cái khác: môi trường edge không có dependency ngoài (dùng @passwordless-id/webauthn) và enterprise TPM attestation chuyên sâu (dùng fido2-lib). Bảng gợi ý ở cuối bài bao phủ cả hai.
Bài viết này dành cho ai
Lập trình viên Node.js đang chọn thư viện WebAuthn server trước khi bắt đầu — hoặc đang cân nhắc lại — một implementation auth không mật khẩu. Nếu bạn muốn cơ sở hạ tầng passkey được quản lý sẵn thay vì tự cài thư viện, bỏ xuống phần Giải pháp SaaS. Bài so sánh này chỉ đề cập đến các thư viện mã nguồn mở.
Tổng quan các thư viện
| Thư viện | Lượt tải npm/tuần | Stars | Phiên bản mới nhất | TypeScript | FIDO conformant |
|---|---|---|---|---|---|
@simplewebauthn/server | ~803K | 2.251 | v13.3.0 (Mar 2026) | Native | ✅ |
@passwordless-id/webauthn | ~22K | 604 | v2.4.0 (May 2026) | Bundled ESM | ❌ |
fido2-lib | ~11.6K | 446 | v3.5.9 (Mar 2026) | JS + types | ❌ |
| Auth.js Passkeys provider | đi kèm next-auth | — | Experimental | Native | qua SimpleWebAuthn (pinned 9.x) |
Nguồn: npmtrends, các trang GitHub repo. Lấy ngày 2026-05-27.
Các thư viện bị loại khỏi danh sách
Một số thư viện xuất hiện trong tìm kiếm nhưng bị loại:
- webauthn4js — Node.js binding cho thư viện Wasm/Go; lần cuối publish đã hơn hai năm trước.
- node-webauthn — lần cuối publish năm 2021; không còn được duy trì.
- @teamhanko/passkeys-sdk — đây là HTTP client có kiểu dữ liệu cho Hanko’s SaaS passkey API, không phải WebAuthn implementation độc lập. Dưới 500 lượt tải hàng tuần và lần cuối publish tháng 9 năm 2025. Sản phẩm của Hanko thuộc phần SaaS, không phải so sánh thư viện.
SimpleWebAuthn
Phù hợp nhất cho: tích hợp mới, mọi runtime, mọi quy mô.
SimpleWebAuthn đã là chuẩn thực tế cho WebAuthn trên Node.js kể từ khi vượt qua FIDO Alliance conformance tests ở v0.7.0. Đến nay thư viện đã ra 86 bản phát hành, với 2.251 GitHub stars, 192 forks và lượt tải vượt xa mọi thư viện cạnh tranh.
Version 13.0.0 bổ sung registration hints cho phép bạn gợi ý loại authenticator với trình duyệt:
const options = await generateRegistrationOptions({
rpName: 'My App',
rpID: 'myapp.com',
userID: Uint8Array.from(userId, c => c.charCodeAt(0)),
userName: userEmail,
authenticatorSelection: {
preferredAuthenticatorType: 'localDevice', // 'securityKey' | 'localDevice' | 'remoteDevice'
},
})
Toàn bộ ceremony đăng ký chỉ gồm hai server call xoay quanh một browser call:
// 1. Server: tạo challenge + options
const options = await generateRegistrationOptions({ rpName, rpID, userID, userName })
// 2. Browser: gọi WebAuthn API
const response = await startRegistration({ optionsJSON: options })
// 3. Server: xác minh response, lấy credential để lưu
const { verified, registrationInfo } = await verifyRegistrationResponse({
response,
expectedChallenge: options.challenge,
expectedOrigin: 'https://myapp.com',
expectedRPID: 'myapp.com',
})
Authentication theo cùng cấu trúc với generateAuthenticationOptions và verifyAuthenticationResponse. Khi đã hiểu cấu trúc ceremony, API không còn cản trở bạn nữa.
Tại sao FIDO conformance quan trọng: FIDO Alliance chạy bộ kiểm thử chính thức cho tất cả attestation statement format và credential verification path. Thư viện bỏ qua conformance testing vẫn có thể hoạt động với phần lớn trường hợp đăng ký — nhưng WebAuthn có đủ optional path và edge case khiến các implementation chưa được kiểm thử đầy đủ tích lũy bất ngờ. SimpleWebAuthn là thư viện WebAuthn mã nguồn mở duy nhất cho Node.js vượt qua bộ kiểm thử FIDO Alliance conformance.
Hỗ trợ runtime rộng: Node LTS 20+, Deno 1.43+ (và 2.x), Bun và Cloudflare Workers. Các package được publish song song lên npm và JSR.
Rủi ro thực sự duy nhất: phụ thuộc vào một người duy trì. MasterKale đã xây dựng và duy trì project này một mình qua 86 bản phát hành. Track record đó là thật. Sự phụ thuộc vào một người cũng vậy. Nếu bạn xây dựng hệ thống production trên SimpleWebAuthn, hãy theo dõi hoạt động của project.
@passwordless-id/webauthn
Phù hợp nhất cho: môi trường edge, yêu cầu giới hạn kích thước bundle nghiêm ngặt, hoặc không cho phép dependency ngoài.
Thư viện này làm đúng như tên gọi: không có dependency ngoài. Toàn bộ ship dưới dạng ES module nhỏ gọn. Không có transitive dependency chain, không phình node_modules.
Nó chạy được cả trên server lẫn browser từ cùng một package. v2.4.0 phát hành vào tháng 5 năm 2026 với chỉ một GitHub issue đang mở — một trong những issue tracker gọn gàng nhất bạn có thể thấy ở một auth project.
API surface cố ý đơn giản hơn SimpleWebAuthn. Ít option hơn, ít attestation knob hơn. Đây là đánh đổi thực sự: ít phức tạp để bạn quản lý, nhưng ít khả năng cấu hình edge case hơn. Với ứng dụng hướng người dùng phổ thông mà passkey chỉ là tính năng tiện lợi, surface đơn giản là lợi thế. Với triển khai enterprise mà attestation format selection quan trọng, đó là hạn chế.
Không có chứng nhận FIDO Alliance conformance. Điều này quan trọng trong quy trình mua sắm enterprise. Với hầu hết ứng dụng consumer production, sự khác biệt về bảo mật trong thực tế là nhỏ — WebAuthn ceremony cốt lõi vẫn như nhau.
Lượt tải ở mức ~22K/tuần, thấp hơn SimpleWebAuthn 36 lần. Khoảng cách này thể hiện ở tài nguyên cộng đồng: ít câu hỏi có câu trả lời hơn, ít công cụ bên thứ ba hơn, tài liệu ít được kiểm chứng trong thực tế hơn. Đây không phải thước đo chất lượng code, nhưng là sự khác biệt thực sự về hỗ trợ từ hệ sinh thái.
fido2-lib
Phù hợp nhất cho: triển khai enterprise yêu cầu TPM attestation hoặc xác thực chuỗi certificate chính thức.
fido2-lib trình bày trực tiếp các primitive WebAuthn server. Trong khi SimpleWebAuthn cho bạn generateRegistrationOptions và verifyRegistrationResponse, fido2-lib cho bạn attestationOptions, attestationResult, assertionOptions và assertionResult. Nhiều kiểm soát hơn, nhiều code phải viết hơn.
Lý do chọn nó là chiều sâu attestation format. Nó hỗ trợ packed, TPM, Android SafetyNet, FIDO U2F, Apple, và bao gồm NIST PKITS chain validation. Nếu bạn triển khai cho môi trường enterprise mà hardware security key yêu cầu xác thực attestation đầy đủ với certificate chain validation lên đến trust anchor đã biết, đây là thư viện Node mã nguồn mở duy nhất bao phủ được.
Ở ~11.6K lượt tải hàng tuần, nó có user base thực — chủ yếu là security engineer và các nhóm enterprise cần kiểm soát ở tầng gần protocol. v3.5.9 phát hành vào tháng 3 năm 2026.
Đánh đổi: 23 GitHub issue đang mở, source code JavaScript với types thay vì TypeScript (type definition nằm trong thư mục /types và có thể không theo kịp implementation), và không có FIDO Alliance conformance testing — đáng chú ý với một thư viện tập trung vào độ chính xác attestation. Viết các flow đăng ký và xác thực passkey cơ bản với fido2-lib đòi hỏi nhiều code hơn đáng kể so với SimpleWebAuthn.
Dùng fido2-lib khi TPM attestation hoặc NIST PKITS chain validation là yêu cầu bắt buộc. Với mọi trường hợp còn lại, sự phức tạp tốn nhiều hơn những gì nó mang lại.
Auth.js Passkeys provider
Phù hợp nhất cho: các nhóm đang dùng Auth.js và muốn bổ sung passkeys mà không cần thêm dependency mới.
Auth.js (tên cũ NextAuth.js) đi kèm một Passkeys provider bên trong next-auth v5. Bên dưới, nó ghim @simplewebauthn/[email protected] và @simplewebauthn/[email protected] — đều cách phiên bản hiện tại 13.3.0 nhiều major version.
Nhóm Auth.js gắn nhãn tính năng này là experimental và chưa khuyến nghị cho production. Nó yêu cầu database adapter và tạo bảng Authenticator; không phù hợp với kiến trúc stateless hoặc serverless-first.
Lý do chọn: nếu bạn đang dùng Auth.js, bạn có passkeys mà không cần thêm @simplewebauthn/server làm direct dependency. Integration xử lý việc ánh xạ ceremony cho bạn.
Chi phí: bạn đang chạy phiên bản SimpleWebAuthn cũ được ghim cứng mà không có lộ trình nâng cấp rõ ràng, và bạn đang đặt cược vào việc nhóm Auth.js sẽ bỏ cờ experimental. Cược hợp lý cho internal tools hoặc ứng dụng ít rủi ro; khó biện minh hơn cho cơ sở hạ tầng authentication mà bạn cần tin tưởng.
Bảng gợi ý lựa chọn
| Tình huống | Chọn |
|---|---|
| Tích hợp passkey mới từ đầu | SimpleWebAuthn |
| Đang dùng Auth.js / NextAuth | Auth.js Passkeys provider |
| Môi trường edge hoặc Workers, không có dependency ngoài | @passwordless-id/webauthn |
| Hardware key enterprise, TPM attestation, NIST PKITS | fido2-lib |
| Không cần thư viện server, hạ tầng passkey được quản lý hoàn toàn | Clerk / Descope / Passage |
Giải pháp SaaS
Nếu bạn không muốn tự vận hành WebAuthn server logic, có ba lựa chọn managed bao phủ các phân khúc khác nhau.
Clerk cung cấp passkeys như tính năng GA chính thức qua component <SignIn />. Developer experience tốt nhất trong ba lựa chọn; hoạt động tốt với Next.js và các React framework khác. Có free tier. Xem so sánh Clerk vs Auth0 để hiểu rõ hơn về Clerk như một nhà cung cấp dịch vụ xác thực.
Descope ưu tiên passkey-first với free tier rộng rãi và no-code flow builder. Lựa chọn tốt nếu bạn muốn visual editor cho auth flow cùng với hỗ trợ passkey.
Passage by 1Password hướng đến enterprise, phản ánh thương vụ mua lại của 1Password. Phù hợp nhất khi bạn cần compliance posture của 1Password và đã trong hệ sinh thái đó.
Không có lựa chọn nào trong số này có thể so sánh trực tiếp với các thư viện mã nguồn mở ở trên — chúng abstract hóa toàn bộ WebAuthn server. Quyết định giữa thư viện và SaaS phụ thuộc vào chi phí theo quy mô, yêu cầu compliance, và mức độ kiểm soát bạn cần đối với lifecycle của credential.
Lưu ý
Số lượt tải và stars được lấy vào ngày 2026-05-27. SimpleWebAuthn được duy trì bởi một người; sức khỏe lâu dài của nó phụ thuộc vào sự tham gia tiếp tục của MasterKale. Bài so sánh này xem xét tài liệu, API surface và lịch sử phát hành — không phải benchmark throughput trong production. Nếu latency xác minh ở tải cao quan trọng với trường hợp sử dụng của bạn, hãy tự đo lường với workload thực tế của mình.