【问题标题】:502 on AWS Cognito ListUsers with PaginationTokenAWS Cognito ListUsers 上的 502 和 PaginationToken
【发布时间】:2019-04-26 22:55:23
【问题描述】:

使用 AWSMibileHub 设置我的后端。在管理页面上工作,该页面显示来自 AWS Cognito 的所有用户。

我正在使用ListUsers 获取用户列表,并注意到带有 PagenationToken 的请求出现 502 错误,而且它似乎是随机发生的。

在 CloudWatch 中显示以下错误。 InvalidParameterException: 1 validation error detected: Value 'CAISlAIIARLtAQgDEugBADSdLB5dZXQEaQjoL8y8CE1RGGT3PZ4FpCqxFwJkNuhIeyJAbiI6IlBhZ2luYXRpb25Db250aW51YXRpb25EVE8iLCJuZXh0S2V5IjoiQUFBQUFBQUFCZHM4QVFFQmJBZmU5OFgzUnJTM1BHcnYzVmRiVWNScVdIck82VXFZaTdlZklleVRCSEZsYm1ZN01UVTRPV1k0TVRNdE9UYzVZUzAwWTJKakxUazROekl0TkdRek9UYzROMlpoWmpVM093PT0iLCJwcmV2aW91c1JlcXVlc3RUaW1lIjoxNTQzMDkzODIyNDk5fRogNk7FThSKBOuwQGi DoZBnmNN85UY5oFiSAbHWfOzreY=' at 'paginationToken' failed to satisfy constraint: Member must satisfy regular expression pattern: [\S]+

有没有人有同样的问题或知道如何解决这个问题?

【问题讨论】:

  • 你在哪里看到这个 502?在后端代码的日志中,还是在您正在查看此管理页面的浏览器中?你能收集伴随 502 的响应头吗?
  • @Michael-sqlbot 我从浏览器的前端看到它。还更新了来自 CloudWatch 的错误消息。
  • 我看到的违规接近于令牌wQGi<<here>>DoZBnmNN85UY5oFiSAbHWfOzreY= 的末尾处,不应存在空格字符。我怀疑您有一个包含+ 符号的令牌,并且在将它从前端传递到后端时,您不会以某种方式将其作为%2B 进行url 转义,因此它变成了一个空格。您是否熟悉 url-escaping(又名 url-encoding)的工作原理,以及为什么 + 符号需要特殊处理?
  • @Michael-sqlbot 谢谢你的回答。我不熟悉它,但现在可以做一些研究:)
  • 您在那里所做的最终结果只是.replace(/\ /g,'+')(将空间改回+),它涵盖了流程中早期的错误,所以即使它有效,它也不是真正的正确解决方案。如果没有更多地了解您的设计方式,我建议您构建一个包含在前端单击的令牌的链接。您需要在 将其写入 HTML 之前对该值进行编码。

标签: aws-lambda aws-api-gateway amazon-cognito aws-amplify


【解决方案1】:

将分页Token存储在变量中,然后将此.replace(/\ /g,'+')添加到变量中以将空格更改回+。

例如:

const pagination = 'TOKEN FROM COGNITO'.replace(/\ /g,'+')

【讨论】:

    【解决方案2】:

    pagination_token 由非字母数字字符组成,因此最好在需要时进行加密和解密。

    加密?解密实用程序文件

    const crypto = require("crypto");
    const algorithm = "aes-256-ctr";
    const password = "sassed";
    
    class Util {
    
      static encrypt_aes(text) {
        let cipher = crypto.createCipher(algorithm, password);
        let crypted = cipher.update(text, "utf8", "hex");
        crypted += cipher.final("hex");
        return crypted;
      }
    
      static decrypt_aes(text) {
        let decipher = crypto.createDecipher(algorithm, password);
        let dec = decipher.update(text, "hex", "utf8");
        dec += decipher.final("utf8");
        return dec;
      }
    }
    
    module.exports = Util;
    

    PaginationToken 加密/解密

      const Util = require("./utils");
      class Users {
         static async getUsersAttributes(params) {
            let listparams = {
              UserPoolId: userPoolID /* required */,
              Limit: params.limit || 10,
            };
            if (params.paginationToken) {
              listparams.PaginationToken = Util.decrypt_aes(params.paginationToken);
            }
            let response = await cognitoISPClient.listUsers(listparams).promise();
            response.PaginationToken = Util.encrypt_aes(response.PaginationToken);
        
            return response;
          }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-03
      • 2017-10-02
      • 2019-03-23
      • 2022-01-11
      • 2021-06-23
      • 2016-08-28
      • 2021-02-12
      • 2018-12-16
      相关资源
      最近更新 更多