Passport 支持使用很多身份验证策略,我们先使用一个本地策略,也就是检查用户名与密码是否匹配。
先给项目安装两个包,在终端,项目所在目录的下面,执行 npm install 安装 passport-local ,这个包提供了本地验证策略,等会儿我们要自己实施一个这样的策略。再安装一下这个包的类型定义,执行 npm install 安装 @types/passport-local ,加上 --save-dev 保存在开发依赖里。
本地验证策略相关的东西可以放在一个模块里,生成一个模块,执行 nest generate module 模块的名字是 auth-local ,放在 auth/modules/local 里面,加上一个 --flat 选项。
在这个模块里再添加一个 provider,执行 nest generate provider 名字是 auth-local.strategy ,放在 auth/modules/local/providers 里面。
本地策略
回到项目,打开 AuthLocalStrategy ,这里我们要实施一种本地验证策略,先让这个类继承一下 PassportStrategy,它来自 @nestjs/passport 这个包,给它提供一个 Strategy ,这个 Strategy 来自 passport-local 这个包,这样这个 AuthLocalStrategy 就应该是一个本地验证策略。
策略默认都有一个名字,本地策略默认的名字是 local,想要修改这个默认的名字,可以设置一下第二个参数,一个字符串,值是 auth-local ,这样这个策略的名字就会是 auth-local。
在这个验证策略类里面,需要提供一个构造方法,添加一个 constructor ,在这个构造方法里面,执行 super() ,要配置一下策略,可以给 super 提供一个选项参数,比如这里我们需要修改一下用户名字段的名字,默认是 username,但是在我们的应用里,用户名字段的名字是 name 。
在验证策略里面,还需要一个 validate 方法,这个方法返回的值就是验证成功以后的用户数据,这个用户数据会添加到请求的 user 这个属性里面,也就是如果通过了身份验证,在请求处理器那里,就可以从请求里面获取到通过身份验证的用户相关的数据了。
不同的验证策略,这个 validate 方法支持的参数是不一样的,比如这里我们用的是本地策略,这个 validate 方法,支持一个 name 参数,类型是 string,还有一个 password 参数,类型也是 string。
在这个方法里,我们可以检查用户提供的用户名还有密码是否跟我们存储的相匹配,如果匹配可以返回这个用户相关的数据。如果不匹配可以返回 null 或者抛出异常。
暂时先添加一个对象,里面添加一个 name 。