如何使用Cypress实现AWS Cognito的Google OAuth登录测试?
Cypress实现AWS Cognito Google OAuth程序化登录方案
解决思路
既然你已经能通过Cypress拿到Google的ID Token,直接绕开前端点击登录的方式,调用AWS Cognito的AdminInitiateAuth API,用Google的身份凭证换取Cognito的用户会话即可,完全避开Google的点击伪造防护。
具体步骤
1. 配置AWS环境参数
在cypress.env.json里添加Cognito相关配置:
{ "cognitoUserPoolId": "us-east-1_xxxxxxxxx", "cognitoClientId": "xxxxxxxxxxxxxxxxxxxxxxxxxx", "awsRegion": "us-east-1", "googleProviderName": "Google" // 对应Cognito身份池里配置的Google提供商名称 }
2. 添加自定义Cypress命令
在cypress/support/commands.js中编写登录命令,引入AWS SDK并调用Cognito API:
import { CognitoIdentityProviderClient, AdminInitiateAuthCommand } from "@aws-sdk/client-cognito-identity-provider"; Cypress.Commands.add('loginWithGoogleCognito', (googleIdToken) => { const cognitoClient = new CognitoIdentityProviderClient({ region: Cypress.env('awsRegion') }); const authParams = { UserPoolId: Cypress.env('cognitoUserPoolId'), ClientId: Cypress.env('cognitoClientId'), AuthFlow: 'ADMIN_NO_SRP_AUTH', AuthParameters: { ID_TOKEN: googleIdToken, PROVIDER_NAME: Cypress.env('googleProviderName') } }; return cognitoClient.send(new AdminInitiateAuthCommand(authParams)) .then(res => { // 把Cognito令牌存入存储,匹配你的应用实际使用的键(以Amplify为例) const { IdToken, AccessToken, RefreshToken } = res.AuthenticationResult; window.localStorage.setItem('amplify-id-token', IdToken); window.localStorage.setItem('amplify-access-token', AccessToken); window.localStorage.setItem('amplify-refresh-token', RefreshToken); // 其他可能需要的存储项,可根据应用实际情况添加 }); });
3. 编写测试用例
结合你已有的Google登录方法,完成端到端测试:
describe('Google OAuth登录验证', () => { it('成功通过Google凭证获取Cognito会话并访问应用', () => { // 调用你已实现的Google API登录方法,获取ID Token cy.loginByGoogleApi().then(googleIdToken => { // 换取Cognito会话 cy.loginWithGoogleCognito(googleIdToken); // 访问应用受保护页面 cy.visit('/dashboard'); // 验证登录状态 cy.get('#user-avatar').should('be.visible'); }); }); });
关键注意点
- Cognito客户端权限:确保你的Cognito应用客户端已启用
ADMIN_NO_SRP_AUTH认证流程(在Cognito控制台的应用客户端设置里开启)。 - 存储键匹配:不同应用存储Cognito令牌的键名可能不同,打开浏览器开发者工具查看你的应用实际存在localStorage/sessionStorage里的键,替换代码中的对应项。
- AWS权限控制:用于调用
AdminInitiateAuth的IAM凭证必须拥有cognito-idp:AdminInitiateAuth权限,建议使用测试专用IAM用户,最小化权限。 - Google Token有效性:确保获取的Google ID Token的受众(
aud字段)与你在Cognito中配置的Google客户端ID一致,且未过期。
内容的提问来源于stack exchange,提问作者lindsaymacvean
相关产品推荐
相关产品推荐

