目錄
2025 最新 NestJS 身份驗證教學
NestJS 是一個基於 TypeScript 的 Node.js 框架,專為構建高效且可擴展的微服務而設計。身份驗證是任何應用程序的重要組成部分,本篇將教你如何在 NestJS 中實現安全的身份驗證,並使用 JSON Web Tokens (JWT) 以及 Passport 來管理用戶的訪問權限。
NestJS 身份驗證的基本原理
NestJS 的身份驗證流程簡單明瞭。用戶在登錄時會提供一個 JWT 令牌,該令牌由伺服器生成並簽名,並在用戶成功登錄後返回給用戶。用戶在之後的請求中需要攜帶此令牌,伺服器會驗證令牌的有效性,從而決定是否允許訪問受保護的資源。
NestJS 身份驗證的實作步驟
以下是實作 NestJS 身份驗證的步驟:
- 安裝所需的依賴項:
- 創建 JWT 策略:
- 設置身份驗證模組:
npm install @nestjs/passport passport passport-jwt jsonwebtoken
接下來,我們需要創建一個 JWT 策略來驗證傳入的令牌。
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromExtractors([(req) => req.cookies.jwt]),
secretOrKey: process.env.JWT_SECRET || 'secretKey',
});
}
async validate(payload: any) {
return { userId: payload.sub, username: payload.username };
}
}
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { JwtStrategy } from './jwt.strategy';
@Module({
imports: [
JwtModule.register({
secret: process.env.JWT_SECRET || 'secretKey',
signOptions: { expiresIn: '60s' },
}),
],
providers: [JwtStrategy],
})
export class AuthModule {}
錯誤排除
在實作過程中,可能會遇到以下常見錯誤:
- 無法讀取 JWT:確保請求中包含了正確的 cookie 並且 JWT 已正確生成。
- 簽名無效:檢查你的 secretKey 是否正確,以及是否與生成 JWT 時使用的相同。
延伸應用
將身份驗證與授權相結合,可以進一步提升應用的安全性。你可以根據用戶角色或權限限制訪問不同的資源。
結語
透過上述步驟,你應該能夠在 NestJS 應用中實現安全的身份驗證。這不僅能保護你的應用程序,也能提升用戶體驗。隨著技術的進步,持續學習和更新知識是非常重要的。
Q&A(常見問題解答)
1. NestJS 身份驗證如何處理用戶登錄?
用戶登錄時,系統會驗證其憑證並生成 JWT,然後將其返回給用戶,之後用戶需要在請求中攜帶該 JWT。
2. JWT 的有效性如何驗證?
當用戶發送請求時,伺服器會使用設定的 secretKey 來驗證 JWT 的簽名,以確保其未被篡改。
3. 如果 JWT 過期了,應該怎麼辦?
當 JWT 過期後,通常需要用戶重新登錄,或者實現刷新令牌的機制來獲取新的 JWT。
—