繁体   English   中英

从浏览器 JS 向 AWS Cognito 用户池进行身份验证

[英]Authenticating to AWS Cognito User Pool from browser JS

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

我在 AWS 文档( 此处此处)中找到了两个示例,展示了如何使用基于浏览器的 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);
        },

    });
}

当我运行此代码时,我得到Uncaught TypeError: AWS.CognitoIdentityServiceProvider.CognitoUserPool is not a constructor in the line var userPool = new AWS.CognitoIdentityServiceProvider.CognitoUserPool(poolData); . 果然,我在 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 果然,文本“AmazonCognitoIdentity”没有出现在 aws.sdk-2.726.0.js 文件中。

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

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

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

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!");
        }
    })
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM