使用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
相关产品推荐
相关产品推荐

