使用Cypress无法绕过Amazon Cognito身份认证的问题求助
问题排查思路
- 检查AWS Cognito用户池的
应用客户端设置:确认允许的回调URL、登出URL是否完全匹配你测试环境的应用地址,域名、端口、路径尾的斜杠都要严格一致,配置不匹配会导致Cognito拒绝回传凭证。 - 校验凭证回传逻辑:确认输入凭证跳转回应用时,回调URL的参数中是否携带Cognito返回的
code/id_token参数,如果参数存在则检查应用是否正确提取该参数,并存到localStorage、sessionStorage或Cookie中,No authorization token was found报错90%以上是应用未成功拿到Cognito返回的凭证。 - 核对后端CORS配置:确认后端接口是否允许请求携带
Authorization头,以及跨域规则中是否开启了凭证传输支持。 - 确认测试域名白名单:如果Cypress测试使用的是自定义测试域名,需要将该域名添加到Cognito用户池的允许域名列表中,否则Cognito会拦截凭证回传请求。
Cypress适配AWS Cognito认证流程方案
Cypress默认有跨域操作限制,不推荐直接操作Cognito托管的第三方登录页,最佳实践是直接调用Cognito接口获取凭证,注入到应用存储中跳过页面跳转步骤:
- 配置Cognito环境变量,在
cypress.config.js中添加如下配置:
const { defineConfig } = require("cypress"); module.exports = defineConfig({ e2e: { experimentalSessionAndOrigin: true, env: { cognitoDomain: "你的Cognito认证域名", cognitoClientId: "你的Cognito应用客户端ID", testUser: "测试用账号", testPassword: "测试用密码" } }, });
- 新增Cypress自定义登录命令,在
cypress/support/commands.js中添加如下代码:
Cypress.Commands.add('cognitoLogin', () => { // 调用Cognito OAuth2接口直接获取凭证 return cy.request({ method: 'POST', url: `https://${Cypress.env('cognitoDomain')}/oauth2/token`, form: true, body: { grant_type: 'password', client_id: Cypress.env('cognitoClientId'), username: Cypress.env('testUser'), password: Cypress.env('testPassword'), scope: 'openid email profile' // 可根据应用实际配置调整 } }).then(res => { const { id_token, access_token, refresh_token } = res.body // 将token写入应用对应的存储位置,和你业务应用的存储逻辑保持一致即可 window.localStorage.setItem('cognitoIdToken', id_token) window.localStorage.setItem('cognitoAccessToken', access_token) window.localStorage.setItem('cognitoRefreshToken', refresh_token) }) })
- 测试用例中直接调用登录命令:
describe('登录后功能测试', () => { it('访问首页无权限报错', () => { // 先调用登录接口注入凭证 cy.cognitoLogin() // 再访问应用地址,此时应用可直接读取到存储中的token,无需跳转登录页 cy.visit('/') cy.contains('应用首页正常内容').should('be.visible') }) })
若你的应用使用Cookie存储凭证,只需将上述localStorage写入逻辑替换为Cookie写入逻辑即可;如果必须要走Cognito托管页面的操作流程,开启
experimentalSessionAndOrigin配置后即可直接操作Cognito页的输入框、登录按钮,该方式适配性更强但稳定性低于API调用方案。
内容的提问来源于stack exchange,提问作者Taimoor Pasha
相关产品推荐
相关产品推荐

