我正在尝试为使用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);
},
});
答案 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
。