用户登录

在 Passport 的 Strategy 里面,validate 方法有个 done,它是一个 VerifiedCallback,在这个 validate 方法里面可以去做一些验证,然后再把验证的结果告诉这个 done。

如果 payload 有值,说明用户提供的 token 是有效的,我们可以再根据 payload 里的用户名,去检查一下应用里面有没有这个用户。

查询用户的任务可以放在 UserService 里面 ,打开 UserService 服务,这里之前我们已经定义好了一个按用户名查询用户的方法。

回到 JwtStrategy ,先把 userService 这个依赖注入进来,private readonly userService: UserService。

然后在 validate 方法里, 从 payload 里面把用户的 name 属性解构出来。

下面添加一个 entity,await,执行 this.userService.findByName,把用户名交给它。

做一下判断,如果没找到用户实体,用户的 token 有效,. 但是对应的用户实体可能在数据库里删除掉了,如果是这样,执行一下 done,第一个参数就是错误,新建一个 UnauthorizedException ,异常信息是 没找到用户。

我们可以继续去做一些其它的验证,不过暂时先这样,一切正常就执行一下这个 done ,第一个参数是错误信息,没有就添加一个 null,第二个参数是用户,这里就是 entity。

测试

回到 HTTP 客户端,配置一个请求,用 GET 请求 auth/test 这个地址。请求里要带着 Authorization 头部,值是 Bearer,然后是一个有效的 Token 值,就是登录成功以后给用户签发的 JWT。

在 auth/test 这个路由上我们用了 jwt 这种验证策略, 在这个策略里会解析出请求里带的 token,根据里面的 name 去查找用户,如果找到就会通过验证,所以这里我们会看到一个成功的响应。

再打开一个数据库客户端,找到 user 数据表,可以删除这个表里的 id 号是 2 的这个用户记录,或者也可以直接修改一下这个用户的用户名,然后再到 Http 客户端,重新发送一下这个请求,验证的时候,虽然 token 是有效的,但是我们没有找到对应的用户,得到的响应状态码是 401,错误信息是 没找到用户。

在策略的验证方法里的这个 done 参数可以去掉它,在验证的时候,如果发现问题,直接 throw 一个异常,去掉 done。一切正常,直接返回用户实体就行了,这样做,代码看起来会更简洁一些。

验证身份的方法(validate)《 Nest.js 应用框架:身份验证 》

统计

14696
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点