Nest.js 在护照本地策略中获取请求标头

Posted

技术标签:

【中文标题】Nest.js 在护照本地策略中获取请求标头【英文标题】:Nest.js get request header in passport local strategy 【发布时间】:2021-09-11 17:49:46 【问题描述】:

如何在护照本地策略中获取请求标头? 我需要为每个实体使用一个单独的数据库,使用 mongodb,所以我需要一种在身份验证之前获取子域的方法,以确定我应该连接到的数据库

    @Injectable()
    export class LocalStrategy extends PassportStrategy(Strategy) 
        constructor(private authService: AuthService) 
            super( usernameField: 'email' )
        
    
        async validate(email: string, password: string, headers:Headers): Promise<IUser> 
            //** this is what I want to have
            //** const subdomain = headers.host.split(".")[0]
            const user = await this.authService.validateUser( email, password ,//** subdomain)
            if (!user) 
                throw new UnauthorizedException()
            
            return user
        
    

【问题讨论】:

【参考方案1】:

您需要将passReqToCallback: true 添加到构造函数中的super 调用中。这将使req 成为validate 的第一个参数,因此您可以执行类似的操作

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) 
  constructor(private authService: AuthService) 
    super( usernameField: 'email', passReqToCallback: true )
  

  async validate(req: Request, email: string, password: string, headers:Headers): Promise<IUser> 
    const subdomain = req.headers.host.split(".")[0];
    const user = await this.authService.validateUser( email, password ,//** subdomain)
    if (!user) 
      throw new UnauthorizedException()
    
    return user
  

【讨论】:

以上是关于Nest.js 在护照本地策略中获取请求标头的主要内容,如果未能解决你的问题,请参考以下文章

节点护照错误:未知身份验证策略“本地登录”

如何在同一端点上使用护照 js 本地和基本策略?

使用promisy重构护照本地策略。 .catch()的问题

护照 未知的身份验证策略“本地”、“脸书”、“谷歌”

如何在保存到数据库之前对密码进行哈希处理以与护照模块兼容(本地护照)

护照本地策略没有被调用