在接口上使用身份验证策略,可以使用 @nestjs/passport 这个包提供的一个守卫。
打开 auth.controller ,比如我们要在这个 login 接口上用一下本地身份验证策略,可以先用一个 @UseGuards 装饰器,给它提供一个 AuthGuard ,然后设置一下要使用的身份验证策略的名字,比如之前我们创建了一个策略,起的名字是 auth-local 。
测试
在 Http 客户端可以测试一下,直接发送一下这个用户登录请求,得到的是一个异常响应,状态码是 401,表示 Unauthorized ,未授权。
原因是没有提供用户名还有密码,设置一下请求主体,类型选择 JSON,准备一个 JSON 数据,添加一个 name 属性,用户名是张三,再添加一个 password,密码是 123123 。
重新发送一下请求,这回接口正常返回了 logged in ,说明用户通过了身份验证。
本地策略
打开 auth-local.strategy 再试一下,让这个 validate 返回一个 null,然后回到 Http 客户端,发送一下用户登录请求,这回得到的就是一个异常响应,提示用户未授权。
自定义守卫
在使用身份验证策略的时候, 我们用到了 AuthGuard 这个守卫,基于这个守卫可以创建一个专门为本地策略准备的守卫。在 src/auth/modules/local 下面新建一个文件,放在 guards 里面,名字是 auth-local.guard.ts。
文件里定义一个类,这个类用 @Injectable 装饰一下,类的名字是 AuthLocalGuard,让它继承一下 AuthGuard,提供一个参数,值就是要使用的身份验证策略的名字,比如 auth-local。
回到 auth.controller,在登录接口处理的上面,可以把这个 AuthGuard 换成一个 AuthLocalGuard 。这样这个 AuthGuard 就不再需要了,把上面导入它用的代码删除掉。
然后在 Http 客户端,再测试一下,发送一下用户登录请求,仍然会提示未授权。