nestjs 登录验证token
时间: 2023-07-06 08:39:16 浏览: 116
在 NestJS 中,我们可以通过中间件来实现 Token 鉴权。具体实现步骤如下:
1. 创建一个 `AuthMiddleware` 中间件,用于验证 Token 是否有效:
```typescript
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
import { AuthService } from './auth.service';
@Injectable()
export class AuthMiddleware implements NestMiddleware {
constructor(private readonly authService: AuthService) {}
async use(req: Request, res: Response, next: NextFunction) {
const authHeader = req.headers.authorization;
if (authHeader) {
const token = authHeader.split(' ')[1];
const decoded = await this.authService.verifyToken(token);
if (decoded) {
req.user = decoded;
return next();
}
}
return res.status(401).send({ message: 'Token验证失败' });
}
}
```
上述代码中,我们定义了一个 `AuthMiddleware` 中间件,通过 `AuthService` 中的 `verifyToken` 方法来验证 Token 是否有效。如果 Token 有效,我们将解码后的信息存储在 `req.user` 中,方便后续的请求处理。
2. 在 `AppModule` 中注册 `AuthMiddleware` 中间件:
```typescript
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { AuthModule } from './auth/auth.module';
import { AuthMiddleware } from './auth/auth.middleware';
import { UserController } from './user/user.controller';
@Module({
imports: [AuthModule],
controllers: [UserController],
})
export class AppModule implements NestModule {
constructor(private readonly authMiddleware: AuthMiddleware) {}
configure(consumer: MiddlewareConsumer) {
consumer.apply(this.authMiddleware).forRoutes('*');
}
}
```
上述代码中,在 `configure` 方法中注册了 `AuthMiddleware` 中间件,并将其应用于所有路由。
3. 在 `UserController` 中添加获取当前用户信息的方法:
```typescript
import { Controller, Get, Req } from '@nestjs/common';
@Controller('user')
export class UserController {
@Get('me')
async me(@Req() req) {
return req.user;
}
}
```
上述代码中,我们定义了一个 `me` 方法用于获取当前用户信息。由于我们在 `AuthMiddleware` 中间件中将解码后的信息存储在了 `req.user` 中,因此在 `UserController` 中可以直接获取该信息。
通过上述步骤,我们就实现了 Token 鉴权。当客户端发送请求时,需要在请求头中带上 Token,服务端会根据 Token 来验证用户身份,并返回相应的结果。
阅读全文