在之前创建的 validateLoginData() 这个中间件里可以对比用户密码是否匹配,就是把用户在客户端提供的要求登录的用户的密码,跟在我们应用里存储的这个用户的密码进行对比,检查它们是否匹配。完成这个对比要用到 bcrypt 这个包提供的功能。
打开 auth.middleware, 在这个文件的顶部,先导入 bcrypt ,来自 bcrypt 这个包。 修改一下 validateLoginData, 这里要使用 getUserByName 的时候,我们可以在结果里包含用户的 password 字段,所以可以设置一下它的第二个参数,一个对象,里面把 password 设置成 true。这样在查询的结果里面就会包含用户的密码字段的值。
就可以去验证用户的密码了。先添加一个对比的结果,matched 等于 await 等待执行一下 bcrypt,用一下它上面的 compare() 这个方法,第一个参数是 password,这个 password 的值就是用户在请求登录的时候提供的密码,第二个参数是 user.password,这个 user.password 是存储在应用数据仓库里的这个用户的密码字段的值。
下面判断一下,如果不匹配的话,就触发一个异常情况,return 执行 next() 带着一个错误,设置一下错误信息,可以设置成 PASSWORD_DOES_NOT_MATCH。
打开 app.middleware,修改一下应用默认的异常处理器,在这个 switch 里面添加一种新的情况,如果异常信息是 PASSWORD_DOES_NOT_MATCH,这种情况可以把响应的状态码设置成 400,响应的信息设置成 密码不对。
打开 HTTP 客户端,配置一下 用户登录 这个请求,准备好请求主体数据,name 设置成 李白,password 可以提供一个错误的密码。 发送一下这个请求,得到的响应,状态码会是 400,响应的信息是 密码不对。
修改一下请求里的 password,换成一个正确的密码,发送一下这个请求,这次就会得到一个正常的响应,响应的信息是 欢迎回来。