使用Amazon Cognito进行赛普拉斯集成测试

时间:2020-07-03 14:21:50

标签: amazon-cognito cypress

我正在尝试为使用Amazon Cognito进行登录的客户端应用程序创建e2e测试。我试图遵循aws文档进行登录。我遇到网络错误。我不确定这是否正确。我收到网络错误消息,因为它可能正在通过我们的VPN。我应该如何使用aws库解决此问题?以下是我从AWS文档中获得的示例代码。

var authenticationData = {
        Username : 'username',
        Password : 'password',
    };
    var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
    var poolData = { UserPoolId : 'us-east-1_ExaMPle',
        ClientId : '1example23456789'
    };
    var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
    var userData = {
        Username : 'username',
        Pool : userPool
    };
    var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: function (result) {
            var accessToken = result.getAccessToken().getJwtToken();

            /* Use the idToken for Logins Map when Federating User Pools with identity pools or when passing through an Authorization Header to an API Gateway Authorizer */
            var idToken = result.idToken.jwtToken;
        },

        onFailure: function(err) {
            alert(err);
        },

});

2 个答案:

答案 0 :(得分:1)

我也在使用 VPN,以下内容对我有用。 我在commands.js文件中添加了不同的登录命令来处理Admin等用户角色

Cypress.Commands.add('loginAdmin', (overrides = {}) => {
Cypress.log({
  name: 'loginAdminViaCognito',
});  

var authenticationData = {
    Username: 'AdminUsername',
    Password: 'AdminPassword'
};
return doLogin(authenticationData);
});

我在同一个文件中有通用的 doLogin 函数,我调用并传递不同的身份验证数据

function doLogin(authData){
var poolData = {
    UserPoolId: 'aws-cognito-userpoolid', 
    ClientId: 'aws-cognito-app-clientid',
};
   
var userPool = new CognitoUserPool(poolData);
var cognitoUser = new AmazonCognitoIdentity.CognitoUser({Username: authData.Username, Pool: userPool});
       
const authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(
    authData
);

return new Promise((resolve, reject) =>
    cognitoUser.authenticateUser(authenticationDetails, {
    onSuccess: function(result){ 
        let token = result.getIdToken().getJwtToken();
        //let accessToken = result.getAccessToken().jwtToken;
        //let refreshToken = result.getRefreshToken().token;
        
        resolve(token);
    },
    onFailure: function(err){            
        reject("Unable to get token. " + JSON.stringify(err));
    }
})
);}

答案 1 :(得分:1)

使用 amazon-cognito-identity-js 包的解决方案仅在您没有客户端机密时才有效:

<块引用>

在创建应用程序时,必须取消选中生成客户端密码框,因为 JavaScript SDK 不支持具有客户端密码的应用程序。 https://www.npmjs.com/package/amazon-cognito-identity-js

我的解决方案是使用 cy.visit 直接访问 Cognito 登录页面,输入我的凭据,然后使用 redirect_uri 提交到 localhost 出于某种原因工作:

cy.visit('https://xxx.amazoncognito.com/login?client_id=xxx&response_type=token&scope=aws.cognito.signin.user.admin+email+openid+phone+profile&redirect_uri=https://127.0.0.1:8000/signedin')
cy.get('input[name=username]:visible').type('xxx')
cy.get('input[name=password]:visible').type('xxx')
cy.get('input[name=signInSubmitButton]:visible').click()
// real test starts here...

我不明白为什么它会这样工作,但确实如此。最后一次点击使用正确的令牌将我重定向到我的 redirect_uri。

编辑:遗憾的是,这还需要在 "chromeWebSecurity": false 中设置 cypress.json