在应用里有些接口虽然不要求一定要验证用户的身份,但是接口可能仍然需要用户的身份信息,根据用户的身份信息再做出相应的响应。
我们可以定义一个可选的 JWT 身份验证守卫,也就是如果在请求里带着用户的令牌,守卫会根据令牌获取到用户信息,如果请求里没有令牌,也不限制用户继续访问接口,这个守卫可以把它用在应用的全局。
在 auth/modules/jwt/guards 里面,复制一份这个 auth-jwt.guard.ts,改下文件的名字,换成 auth-jwt-optional.guard.ts 。打开这个文件,定义并导出一个 AuthJwtOptionalGuard 继承的是 AuthGuard,使用的验证策略是 auth-jwt。
在这个守卫里可以覆盖一下 handleRequest 这个方法,,有个 err 参数,类型是 any ,还有一个 user 参数,类型也可以设置成 any 。默认这个方法会检查有没有 err ,还有 user 参数有没有值,如果有错误,或者用户没有值,就会扔出一个异常。这里我们可以直接 return 这个 user。
打开 app-common.module ,在这个模块的 providers 里面,添加一个对象,provide 设置成 APP_GUARD,useClass 设置成 AuthJwtOptionalGurad。这样就相当于是在应用的全局,使用了这个守卫。