You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Cypress测试全栈NestJS应用中Auth0的登录认证功能

实现思路

你当前已经通过密码授权模式拿到了Auth0返回的token凭证,只需要让NestJS服务端识别这些凭证、生成登录态会话即可,核心逻辑如下:

步骤1:给测试环境加专属会话设置路由

express-openid-connect 提供了原生的setSession方法来手动设置登录态,你可以在NestJS应用中新增一个仅测试环境可访问的路由,用来接收Cypress传入的token参数,生成登录会话:

// 仅测试环境加载的测试用控制器
import { Controller, Get, Query, Req } from '@nestjs/common';
import { Request } from 'express';

@Controller('e2e-test')
export class E2eTestController {
  @Get('auth-set')
  async setAuthSession(
    @Req() req: Request,
    @Query('access_token') accessToken: string,
    @Query('id_token') idToken: string,
    @Query('expires_in') expiresIn: number
  ) {
    if (process.env.NODE_ENV !== 'test') {
      throw new Error('该路由仅可在测试环境访问');
    }
    // 调用express-openid-connect的会话设置方法
    await (req as any).oidc.setSession({
      access_token: accessToken,
      id_token: idToken,
      expires_at: Date.now() + expiresIn * 1000
    });
    return { status: 'ok' };
  }
}

步骤2:补全Cypress登录命令逻辑

在你拿到oauth/token接口的响应后,调用上面的测试路由,让服务端种下登录态cookie,后续所有请求就会自动携带登录态:

Cypress.Commands.add('login', () => {  
  cy.session('logged in user', () => {    
    const options = {
      method: 'POST',
      url: `${Cypress.env('OAUTH_DOMAIN')}/oauth/token`,
      body: {
        grant_type: 'password',
        username: Cypress.env('AUTH_USERNAME'),
        password: Cypress.env('AUTH_PASSWORD'),
        scope: 'openid profile email',
        audience: `${Cypress.env('OAUTH_DOMAIN')}/api/v2/`,
        client_id: Cypress.env('OAUTH_CLIENT_ID'),
        client_secret: Cypress.env('OAUTH_CLIENT_SECRET'),
      },
    };
    cy.request(options).then((response) => {
      const { access_token, id_token, expires_in } = response.body;
      // 调用测试路由设置登录态
      cy.request({
        url: '/e2e-test/auth-set',
        qs: { access_token, id_token, expires_in }
      });
      // 验证登录态生效
      cy.visit('/');
      // 可加断言确认登录成功,比如页面出现用户头像、用户名等元素
    });  
  });
});

注意事项

  • 需要提前在Auth0后台的应用配置中,开启「Password Grant Type」授权类型,否则oauth/token接口会报错。
  • 确保Cypress和NestJS服务端使用的Auth0 client_id、client_secret、domain等配置完全一致。
  • 生产环境不要加载这个测试控制器,避免出现安全漏洞。

内容的提问来源于stack exchange,提问作者Pezholio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:36:03