当前位置: 首页 > 知识库问答 >
问题:

我应该在哪里以及如何检查访问令牌在 passportjs 中的有效性

冯茂实
2023-03-14

我正在实现刷新令牌,我使用passportjs。我不完全理解的是,我应该在哪里以及如何检查访问令牌的有效性,以及在无效令牌到达的情况下抛出< code > tokenexpire exception 。

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
    constructor(
        private readonly authService: AuthService,
    ) {
        super({
            jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
            ignoreExpiration: false,
            secretOrKey: process.env.JWT_SECRET,
        });
    }

    public async validate(payloadDto: PayloadDto): Promise<PayloadDto> {
        const validUser = await this.authService.validateUser(payloadDto);
        return { id: validUser.id, phone: validUser.phone };
    }
}

validateUser方法当前如下所示:

    public async validateUser(payload: PayloadDto): Promise<UserEntity> {
        const retrievedUser: UserEntity = await this.userService.retrieveOne(payload.phone);
        if (retrievedUser) {
            return retrievedUser;
        } else {
            throw new HttpException('Invalid User', HttpStatus.UNAUTHORIZED);
        }
    }

我想知道这样检查是否安全:

@Injectable()
export class RefreshAuthGuard extends AuthGuard('jwt') {
    public handleRequest(err: any, user: any, info: Error): any {
        if (info) {
            if (info.name === 'TokenExpiredError') {
                throw new HttpException('TokenExpired', HttpStatus.UNAUTHORIZED);
            } else {
                throw new HttpException('Unauthorized', HttpStatus.UNAUTHORIZED);
            }
        }
    }
}

共有1个答案

徐鸿达
2023-03-14

我建议改变你的认证流程如下(也见线程和线程):

  1. 客户端尝试使用过期的身份验证令牌调用受保护的路由/秘密
  2. 服务器向客户端抛出TokenExpiredError
  3. 客户端现在使用其有效的刷新令牌在auth服务器上请求新的访问令牌
  4. auth服务器检查刷新令牌并向客户端发出新的访问令牌
  5. 客户端使用其新的访问令牌重试/秘密

刷新令牌的全部目的是它永远不会与资源服务器共享,也不会随每个请求一起发送;这提高了安全性。如果资源服务器自己发出刷新请求,您就无法实现这一目的。如果资源服务器和身份验证服务器相同,您仍然可以从不发送如此多的长期(➡更高风险)令牌中受益,即它们通过中间人攻击受到损害的机会更小。

 类似资料:
  • 我无法轻松决定如何从后端接收刷新令牌和访问令牌,以及将其存储在哪里。 我理解的认证过程如下。 XSS可以用cookies进行防御 我参考了许多文章,据说XSS将被cookie阻止,CSRF将被刷新令牌和访问令牌保护。 对于刷新令牌,它存储在webStorage中。 然而,为了防止XSS,在访问令牌的情况下,似乎应该使用cookie来保护它们(仅适用于Http),在刷新令牌的情况下,似乎应该将它们存

  • 我正在使用vue.js和vuex开发一个应用程序,它使用JWT令牌对JSON API服务器进行身份验证。所以我想知道存放JWT代币的最佳做法是什么? 如果我将其存储在vuex商店中,则页面刷新后它会丢失,因此用户需要再次登录,这不是很方便。 如果我将其存储在浏览器的本地存储中,它会在下次登录之前被弃用,然后假设身份验证令牌的组件会混淆。我不知道如何处理这个问题。 感谢你对此的暗示。

  • 我试图用oauth2和jwt为我的API添加安全性。所以目前我可以使用以下命令并获得访问令牌。curl客户端:secret@localhost:8080/oauth/token-d grant_type=password-d username=user-d password=password 显然,我不打算为每个用户调用它))我的问题是在哪里调用这个命令?我应该创建像“localhost:8080

  • 在GitHub中生成个人访问令牌后,是否有必要将其存储在机器的本地某处? 如果是,是否有任何首选的存储方式?

  • 以下是Spotify API的文档(我使用的是隐式授权流):https://beta . developer . Spotify . com/documentation/general/guides/authorization-guide/# Implicit-Grant-Flow 我正在尝试在Google表格中编写脚本。我专注于基本设置,但我似乎无法让访问令牌正常工作。 解决了的: 我目前收到以

  • 如果是,是否有任何首选的存储方式?