我正在使用 Angular+Nest 开发一个网站。我创建了一个服务(Angular),以便客户端可以在项目启动时从服务器获取用户信息(与新鲜相同)。有些动作不需要登录,所以登录是可选的。
我想要的是如果用户已经登录,那么客户端应该发送一个请求来获取用户的信息。
服务器代码如下:
export const RequestUser = createParamDecorator((data, req): RequestUserDTO => {
return req.user;
});
@Controller('auth')
export class AuthController {
@Get('getUserInfoByToken')
async getUserInfoByToken(@RequestUser() user: User): Promise<any> {
if (user) {
return {
nickname: user.nickname,
level: user.level
};
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现如果我不添加@UseGuards(AuthGuard())为装饰器,就没有任何回报。但是如果我添加它,当项目开始时,这个请求401作为状态代码返回。然后网页将转到登录页面。
我应该怎么做才能避免这种情况?并非每个操作都需要登录。
如果您有完全不同的方法,请告诉我 - 会尽力提供帮助。
将尝试提供更详细的示例,其中包括passport引擎盖下的内容。它假定passport已使用并且Authorization正在发送该令牌。
const RegisteredPassportModule = PassportModule.register({ defaultStrategy: 'bearer' })HttpStrategy到一些AuthModulePassportModule.register({ defaultStrategy: 'bearer' })到进口AuthModule然后:
AuthService是一项服务(和 的一部分AuthModule),它允许Authorization直接从数据库中通过通过标头传递的令牌发送的令牌来查找给定用户。
import { Strategy } from 'passport-http-bearer';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { AuthService } from './auth.service';
@Injectable()
export class HttpStrategy extends PassportStrategy(Strategy) {
constructor(private readonly authService: AuthService) {
super()
}
async validate(token: string) {
const user = await this.authService.findUserByToken(token);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
Run Code Online (Sandbox Code Playgroud)
用法毕竟非常简单(您可以为控制器的任何一种方法设置保护):
@UseGuards(AuthGuard())
@Get()
someMethod(@Req() request: RequestWithUser, ...) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
哪里RequestWithUser只是:
import { User as UserEntity } from '../../models/user.entity'
export type RequestWithUser = Request & { user: UserEntity }
Run Code Online (Sandbox Code Playgroud)
并且/user端点将刚刚返回request.user
我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
6763 次 |
| 最近记录: |