我正在构建一个具有微服务架构的应用程序,我将使用 RabbitMQ 作为消息代理来进行服务到服务通信以及从网关到服务的通信。但关于授权,我有一点想知道。
使用 NestJS,我可以轻松地将消息发送到任何服务并从它们那里获取响应,但是如何处理每个服务中的身份验证或更明确的问题,从网关向服务发送令牌的最佳实践是什么。这是我从现在开始所做的事情的总结。
我的控制器带有 AuthGuard,如您所见
@Controller()
@UseGuards(AuthGuard)
export class UserController {
constructor(private readonly userService: UserService,
) {
}
@MessagePattern('user/me')
async findOne(@Payload() params: FindOneDTO) {
console.log(params);
try {
const user = await this.userService.findOne(params.id);
return user;
} catch (err) {
console.log(err);
throw err;
}
}
}
我的网关控制器向服务发送消息
@Controller('account')
@ApiTags("Account Methods")
export class AccountController {
@Get(':id')
async me(@Param('id', ParseIntPipe) id: number): Promise<any> {
const dto: FindOneDTO = {id};
const userAgentInfo = this.userAgentService.getUserAgentInfo();
console.log(userAgentInfo);
return this.sendMicroserviceRequest("user/me", dto);
}
}
所以让我们来解决这个问题,我希望我的每个服务都可以自己与身份验证服务进行通信,但我不知道将授权令牌传递给服务的最佳实践是什么,因为现在它们只从网关接收 DTO,而没有我不想向 dto 添加令牌。
也许您可以将令牌作为消息头传递?
在 RabbitMQ 中,您可以将令牌放入消息属性的标头中 (https://www.rabbitmq.com/publishers.html#message-properties)。
消费者可以检索此令牌并使用它来拨打电话。
注意:您必须处理令牌过期的情况。