gpt4 book ai didi

controller - 如何从 Controller 中的 header 获取 JWT token

转载 作者:行者123 更新时间:2023-12-04 11:22:02 25 4
gpt4 key购买 nike

请帮我找到如何优化我的代码。
我需要限制登录用户的数据。为此,我需要从 Request 的 JWT token 中获取 UUID。但我不喜欢我的方法,因为我有重复的代码:

const jwt = request.headers.authorization.replace('Bearer ', '');
const json = this.jwtService.decode(jwt, { json: true }) as { uuid: string };

有谁知道我如何优化它?

这是我的 Controller 代码。

import { Controller, Get, Put, Body, Param, UseGuards, Req } from '@nestjs/common';
import { SettingService } from '../services';
import { AuthGuard } from '@nestjs/passport';
import { ResultInterface } from '../interfaces';
import { Request } from 'express';
import { JwtService } from '@nestjs/jwt';

@Controller('settings')
export class SettingController {
/**
* @param service
* @param jwtService
*/
constructor(private readonly service: SettingService,
private readonly jwtService: JwtService) {
}

@UseGuards(AuthGuard('jwt'))
@Get()
async findAll(@Req() request: Request): Promise<ResultInterface> {
const jwt = request.headers.authorization.replace('Bearer ', '');
const json = this.jwtService.decode(jwt, { json: true }) as { uuid: string };
const data = await this.service.findAll(json.uuid);
return { rows: data };
}

@UseGuards(AuthGuard('jwt'))
@Get(':id')
async findOne(@Param('id') id: number, @Req() request: Request): Promise<ResultInterface> {
const jwt = request.headers.authorization.replace('Bearer ', '');
const json = this.jwtService.decode(jwt, { json: true }) as { uuid: string };
const data = await this.service.findOneById(id, json.uuid);
return { row: data };
}

@UseGuards(AuthGuard('jwt'))
@Put()
update(@Body() data: any, @Req() request: Request): Promise<any> {
const jwt = request.headers.authorization.replace('Bearer ', '');
const json = this.jwtService.decode(jwt, { json: true }) as { uuid: string };
return this.service.update(data, json.uuid);
}
}

最佳答案

为了使您的代码更具可读性和透明性,您可以创建一个 @AuthUser() 装饰器并在您的所有 Controller 中重用它。当您使用 AuthGuard('jwt') 时,您已经在解码 token ,如果您再次使用 jwt.decode 函数,则对 token 进行双重解码。

我在下面附上了返回我所有订单的用户装饰器和订单 Controller 函数的示例。

user.decorator.ts

import { createParamDecorator } from '@nestjs/common';

export const AuthUser = createParamDecorator((data, req) => {
return req.user;
});

order.controller.ts
 @ApiOperation({ title: 'Get my orders' })
@Get('/me')
@UseGuards(AuthGuard('jwt'))
async findMyOrders(@AuthUser() user: any): Promise<Order[]> {
return this.orderService.findbyUserId(user._id);
}

关于controller - 如何从 Controller 中的 header 获取 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57833669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com