在我们的应用里使用了 passport 提供的方法验证用户的身份,它支持很多不同的验证方法,下面我们要用的是 jwt 这种策略。先给项目安装一个需要的包,在终端,项目所在目录的下面,执行 npm install 安装一下 passport-jwt 这个包。
完成以后再安装一下这个包的类型定义,npm install 安装 @types/passport-jwt ,加上 --save-dev 把它保存在项目的开发依赖里。
然后我们要自己实施一个 jwt 验证策略,先生成一个 provider ,执行 nest generate provider 名字是 auth-jwt.strategy ,放在 auth/modules/jwt/providers 里面,加上一个 --flat 选项。
定义 Jwt 验证策略
回到项目,打开 AuthJwtStrategy,这里我们需要实施一种 Jwt 的身份验证策略,让这个类继承一下 PassportStrategy,给它提供一个 Strategy,注意这个 Strategy 来自 passport-jwt 这个包,然后再设置一下这个策略的名字,比如 auth-jwt 。
在类里面添加一个构造方法,注入一个依赖,需要的是 configService,类型是 ConfigService。在构造方法里执行一下 super,提供一个对象参数配置一下这种策略。它的类型是 StrategyOptions,这个东西也来自 passport-jwt 这个包。
先设置一下 jwtFromRequest,值可以用一下 ExtractJwt.fromAuthHeaderBearerToken 这个方法,这里实际上就是告诉这种策略,要从哪里获取到令牌,我们在客户端那里,可以把 Jwt 放在一个 Authorization 头部里面,这个头部的值是 Bearer 然后一个空格,接着才是 Jwt ,也就是我们需要的令牌的值。这个设置可以让这个策略从请求的这个头部里把需要的 Jwt 提取出来。
下面添加一下 secretOrKey,因为在签发令牌的时候,用的是密钥,所以解密这个令牌,需要使用密钥或者跟这个密钥对应的公钥。这里用一下 configService.get 得到 jwt.publicKey 这个配置,配置的值就是需要用的公钥。然后设置一下 algorithms ,一个数组,里面添加一个 'RS256' 。
在这个策略里面,还需要一个 validate 方法,第一个参数是验证了 Jwt 以后,包含在令牌里面的数据,也就是当前我们在签发令牌的时候,放到令牌里的数据,比如有用户的 id ,还有 name ,类型可以把它设置成 any 。
在这个方法里,可以根据 payload 里面的用户的 id,获取到用户相关的数据,或者做一些验证工作。解构一下这个 payload ,需要 id 还有 name 。然后让 validate 这个方法返回一个对象,里面添加一个 id 还有 name 。