验证用户提供的登录凭证可以使用一个命令,先去创建一个命令,在终端,项目所在目录的下面,执行 npm run gc 生成一个命令,名字是 validate-user-credential,放在 auth/modules/local/commands 目录的下面。
回到项目,先打开 AuthLocalModule 模块,在模块的 imports 里面,添加一个 UserModule。
打开刚才生成的命令,在命令参数里面添加一个 name 类型是 string,再添加一个 password ,类型是 string。然后打开这个命令的处理器,在构造方法里面,注入一个 Repository ,实体是 UserEntity ,名字是 userRepository,然后分别导入需要的这些东西。
在 execute 里面,解构一下命令参数,需要的是 name 还有 password,来自 command.params。
下面解构声明一个 user,等于 await ,执行 this.userRepository.find,提供一个对象,用 where 设置条件,name 的值应该等于 name。
判断一下,如果 !user ,可以 throw 一个异常,新建一个 BadRequestException,异常信息是没找到用户。如果用户存在,我们得对比一下用户的密码是否匹配。
在文件顶部,导入 bcrypt 里面提供的所有东西,添加一个前缀,名字是 bcyrpt,来自 bcrypt 这个包。
回到 execute,声明一个 isPassowrdMatches ,等于 await,用一下 bcrypt.compare ,对应一下 password,还有 user 里的 password ,也就是比较一下用户在客户端那里提供的密码,还在存储在我们的数据仓库里的用户的密码。
因为用户提供的密码是明文密码,我们存储的密码是 hash 之后的密码,所以不通直接比较它们是否相同。在比较它们的时候,需要用到 bcrypt 包里提供的 compare 这个方法。
下面判断一下,如果 !isPasswordMatches,如果密码不匹配,throw 一个异常,新建一个 BadRequestException,异常信息是密码不对。
一切正常,让这个命令返回这个 user。
执行命令
打开 AuthLocalStrategy,先在构造方法这里注入一个 CommandBus 依赖。
然后在这个 validate 方法里面,return 的东西可以执行一个命令,要执行的是 ValidateUserCredentialCommand,提供一个对象,里面有个 name,还有 password。
测试
在 Http 客户端测试一下,发送一下这个用户登录请求,验证通过,会返回 logged in ,下面可以修改一下要用户的用户名,发送一下请求,提示没找到用户,再试一下,这回改一下用户的密码,发送请求,提示密码不对。
最后再把用户名还有密码都改成正确的,发送请求,验证通过,就会返回 logged in 这行文字。