织梦茶叶网站模板免费下载,北京高端建站公司,延吉 网站建设,石家庄网络推广公司有哪些目标
nestjs经常需要设置一些鉴权#xff08;登录后#xff09;才能访问的接口#xff0c;但是生成的swagger文档可以发起接口请求#xff0c;文档发起的请求默认是不携带登录token的#xff0c;所以需要移除swagger文档发起请求的守卫拦截。
nestjs守卫拦截设置见另一篇…目标
nestjs经常需要设置一些鉴权登录后才能访问的接口但是生成的swagger文档可以发起接口请求文档发起的请求默认是不携带登录token的所以需要移除swagger文档发起请求的守卫拦截。
nestjs守卫拦截设置见另一篇博客 nestjs守卫/全局守卫校验jwt-CSDN博客 方案一
关闭swagger文档请求守卫拦截
global.guard.ts
import { Injectable, NestInterceptor, ExecutionContext, HttpException, HttpStatus } from nestjs/common;Injectable()
export class GlobalGuard implements NestInterceptor {intercept(context: ExecutionContext, next): Observableany {const request context.switchToHttp().getRequest();// 判断是否是swagger文档访问如果请求头referer包含/api-docs则认为是swagger文档访问// 文档前缀在main.ts设置本项目文档前缀设置的api-docsconst apiDocAccess request.headers[referer].indexOf(/api-docs) -1;if (!apiDocAccess) {// 非文档访问、需要鉴权才能访问的接口执行鉴权逻辑// ...}// 其他场景直接放行return next.handle();}
}
方案二
swagger文档添加鉴权请求头信息
接口添加 jwt 鉴权后接口文档调用接口请求头没有添加 authorization请求会返回403。为此需要给文档需要鉴权的接口请求头也添加 authorization main.ts 配置 BearerAuth 校验
const config new DocumentBuilder().setTitle(接口文档).setDescription(接口文档描述).setVersion(1.0).addBearerAuth() // 注意此处文档添加BearerAuth.build();
const document SwaggerModule.createDocument(app, config);
SwaggerModule.setup(api-docs, app, document); // 文档前缀设为 api-docs
在需要鉴权的接口添加 ApiBearerAuth() 装饰器
import { ApiBearerAuth } from nestjs/swagger;Controller(api)
ApiBearerAuth() // 在此处添加表示/api/的接口请求头全都需要添加authorization
export class ApiController {Get(getUserInfo)UseGuards(AuthGuard)ApiBearerAuth() // 在此处添加表示当前接口请求头需要添加authorizationgetUserInfo(): any {return this.apiService.getUserInfo();}
}
使用
先调用登录接口获取到 jwt_token 注意可以设置默认请求参数参数用一个swagger测试账号就不用每次调用再改参数了。设置方法如下
class LoginDto {ApiProperty({description: 用户名, default: swagger-test})name: stringApiProperty({description: 密码, default: 123456})password: string
}
点击文档顶部Authorize按钮 输入获取到的 jwt_token并点击Authorize然后关闭弹窗 再调用需要鉴权的接口就可以鉴权通过了 注意请求头的 Authorization 参数会在最前面添加 Bearer 字符可以在守卫中将此字符移除
this.jwtService.verify(token.replace(Bearer , ))