【问题标题】:Authenticating to AWS Cognito User Pool from browser JS从浏览器 JS 向 AWS Cognito 用户池进行身份验证
【发布时间】:2020-11-25 16:31:35
【问题描述】:

我正在构建一个概念验证网络应用程序,并希望使用 AWS Cognito 用户池作为我的用户身份验证机制。我已经配置了一个用户池和一个客户端应用程序。我已经使用托管 UI 注册了一个测试用户。现在我需要从浏览器验证该用户。

我在 AWS 文档中找到了两个示例(herehere),展示了如何使用基于浏览器的 javascript 针对 Cognito 用户池对用户进行身份验证。我找不到任何一个为我工作。

这是我的最少代码演示 HTML(两个文本框和一个按钮):

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Test Page</title>
    </head>
    <body>
        <input id="username" type="text" value="myUser"></input> <br>
        <input id="password" type="password" value="myPa55w0rd!"></input> <br>
        <button onclick="login()">Log In!</button>

        <script src="https://sdk.amazonaws.com/js/aws-sdk-2.726.0.js"></script>
        <script src="js/myscript.js"></script>
    </body>
</html>

这是我的 myscript.js(版本 1,来自 https://aws.amazon.com/blogs/mobile/accessing-your-user-pools-using-the-amazon-cognito-identity-sdk-for-javascript/):

function login() {
    AWS.config.region = "us-west-2";

    var poolData = {
        UserPoolId : 'us-west-2_redacted',
        ClientId : 'abcdefghijklmnopqrstuvwxyz'
    };
    var userPool = new AWS.CognitoIdentityServiceProvider.CognitoUserPool(poolData); <--Error here

    var authenticationData = {
        Username : document.getElementById("username").value,
        Password : document.getElementById("password").value
    };
    var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.authenticationDetails(authenticationData); 

    var userData = {
        Username : document.getElementById("username").value,
        Pool: userPool
    };
    var cognitoUser = new AmazonCognito.CognitoIdentityServiceProvider.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;

            alert("Authentication successful!");
        },

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

    });
}

当我运行这段代码时,我在var userPool = new AWS.CognitoIdentityServiceProvider.CognitoUserPool(poolData); 行中得到Uncaught TypeError: AWS.CognitoIdentityServiceProvider.CognitoUserPool is not a constructor。果然,我在 aws-sdk-2.726.0.js 文件的任何地方都没有看到“CognitoUserPool”。

这是我的第二次尝试,使用 https://docs.aws.amazon.com/cognito/latest/developerguide/authentication.html 的代码示例:

function login() {
    var authenticationData = {
        Username : document.getElementById("username").value,
        Password : document.getElementById("password").value
    }

    var authenticationDetails = new AmazonCognitoIdentity.authenticationDetails(authenticationData); <-- Error here
    var poolData = {
        UserPoolId : 'us-west-2_redacted',
        ClientId : 'abcdefghijklmnopqrstuvwxyz'
    };
    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);
        },
    });
}

当我运行此代码时,我得到 Uncaught ReferenceError: AmazonCognitoIdentity is not defined。果然,aws.sdk-2.726.0.js 文件中没有出现文本“AmazonCognitoIdentity”。

我一直在追寻这个问题,到目前为止还没有找到解决方案。我非常想避免转向 Amplify 框架。这带来了我宁愿避免的新框架的陡峭学习曲线的成本,至少目前是这样。另外,我几乎不是一个 JS 程序员,当然也不是一个 node 程序员,所以我必须爬上学习 node.js 的小山,然后才能转向 ​​Amplify。

是否可以在不使用 Amplify 的情况下使用简单的客户端 Javascript 对用户进行身份验证?如果是这样,我将非常感谢一个完整的工作示例(或有人指出我做错了什么。)

【问题讨论】:

    标签: javascript amazon-web-services amazon-cognito


    【解决方案1】:

    对于遇到此问题的任何人,我找到了解决方案。我不知道它是否是 正确 的解决方案。祝大家好运:

    function login() {
        AWS.config.update({region : "us-west-2"});
    
        const payload = {
            AuthFlow: "USER_PASSWORD_AUTH",
            ClientId: "abcdefghijklmnopqrstuvwxyz",
            AuthParameters : {
                USERNAME: document.getElementById('username').value,
                PASSWORD: document.getElementById('password').value
            }
        }
    
        var cognito = new AWS.CognitoIdentityServiceProvider();
        cognito.initiateAuth(payload, function(err,data) {
            if (err) {
                alert("Error: " + err);
            }
            else {
                alert("Success!");
            }
        })
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-18
      • 2018-11-05
      • 1970-01-01
      • 2018-05-08
      • 2017-12-03
      • 2021-06-23
      • 1970-01-01
      • 2020-07-31
      • 2017-01-02
      相关资源
      最近更新 更多