代码之家  ›  专栏  ›  技术社区  ›  Mehran

AWS Cognito认证的主密钥实现

  •  0
  • Mehran  · 技术社区  · 6 年前

    以下是使用Cognito对用户进行身份验证的步骤:

    1. 浏览器要求访问受限页面。
    2. 加载页面上的JavaScript查找 id_token 在URL页面上。如果找不到,浏览器将重定向到Cognito的登录页面,用户需要在其中输入用户名和密码。
    3. 一旦用户通过身份验证,浏览器将重定向回原始受限页面,并显示 id\u令牌 在URL中。
    4. 受限页面上的JavaScript使用 id\u令牌 调用API网关。

    现在,我有一个不同的想法。假设有一个安全的连接,任何使用该连接访问受限制页面的人都不需要经过身份验证。换句话说,他们的身份是假定的,不会要求他们进行身份验证。相反,它们将作为一个特定用户被带到受限页面(每个安全连接将代表一个固定的特定用户)。为简单起见,您可以假设安全连接由IP标识。在此场景中,上述步骤将更改为:

    1. 浏览器要求访问受限页面。
    2. 加载页面上的JavaScript查找 id\u令牌 在URL页面上。如果未找到,则调用服务器上的某些API。
    3. 使用传入请求的IP地址,调用的API将识别用户并返回 id\u令牌 不需要任何密码。
    4. 受限页面上的JavaScript使用 id\u令牌 调用API网关。

    这里的关键要求是,我正在寻找一种并行实现这两个方面的方法。我的意思是,每个用户都应该能够从没有密码的安全连接和使用密码的非安全连接访问受限制的页面。换句话说,在第二个场景中调用的API应该能够返回 id\u令牌 对于不知道密码的用户。或者使用主密钥密码。

    这是我的问题。我有没有办法返回一些用户的 id\u令牌 不知道他们的密码?

    P、 我知道IP对于这个实现来说不够安全。这只是为了简化问题。请不要担心提供实际安全手段来验证连接真实性的可行性。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mehran    6 年前

    我自己找到了答案。它叫 CUSTOM_AUTH 流要实现这一点,您需要采取多个步骤:

    首先,转到Cognito控制台,然后单击您的用户池。转到 triggers 第页并介绍lambda函数 Define Auth Challenge 。此lambda函数的最简单代码如下所示:

    exports.handler = (event, context, callback) => {
        event.response.challengeName = "";
        event.response.issueTokens = true;
        event.response.failAuthentication = false;
        callback(null, event);
    };
    

    第二个也是最后一个,创建lambda函数来验证用户:

    const AWS = require('aws-sdk');
    exports.handler = (event, context, callback) => {
        const cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();
        var params = {
          AuthFlow: 'CUSTOM_AUTH',
          ClientId: 'XXXXXXXXXXXX', /* required */
          UserPoolId: 'XXXXXXXXXX', /* required */
          AuthParameters: {
            'USERNAME': 'XXXXXXXXXX', //Username / Email
          },
        };
        cognitoidentityserviceprovider.adminInitiateAuth(params, function(err, data) {
            if (err) {
                console.log(err, err.stack); // an error occurred
                callback(null, err);
            }
            else {
                console.log(data);           // successful response
                callback(null, data);
            }
        });
    };
    

    正如您所看到的,代码不需要密码,它返回您需要的所有令牌(id\u token、access\u token和refresh\u token等)。