如何避免在应用程序中硬编码 AWS Cognito 数据

How to avoid hardcoding AWS Cognito data in the app

我正在创建一个连接到 AWS 服务的 Electron 应用程序。在可以访问服务之前,用户需要使用 AWS Cognito 进行身份验证。为了让用户进行身份验证,我需要在客户端应用程序中硬编码应用程序区域、用户池 ID、身份池 ID 和应用程序客户端 ID。硬编码这是一个糟糕的想法,因为这些值会因客户端而异。

在我的应用程序中,用户从不直接与数据库交互,否则我会让他们查询数据库以获取此数据。用户连接到 Elastic Beanstalk 端点,而我的 EC2 实例是唯一允许与数据库通信的实例。这提高了安全性。

避免对此类数据进行硬编码的最佳方法是什么?

一般情况下,配置应该存储在环境中(参见https://12factor.net/)。

这意味着不同的环境不同,我对电子一无所知,但你的配置值将在构建时知道,所以当你构建你的客户端时,你可以构建一个 environment.js 文件可以从您的应用中引用其值。

使用 CloudFormation 和 CodePipeline 的示例

所以,也许您正在使用 CloudFormation 来配置您的 Cognito 基础设施。在这种情况下,您可以 export variables 可以被其他 CloudFormation 模板引用。

可以将这些导出的应用程序客户端 ID、用户池 ID、身份池 ID 等注入到 CloudFormation 模板中,该模板定义了一个 CodePipeline 实例,您可以使用该实例来构建您的电子应用程序,其中以下内容可能是片段:

...
BuildElectronProject:
    Type: AWS::CodeBuild::Project
    Properties:
      Name: electron-build
      Artifacts:
        Type: CODEPIPELINE
      Environment:
        ComputeType: BUILD_GENERAL1_SMALL
        EnvironmentVariables:
          -
            Name: AWS_REGION
            Value: !Ref 'AWS::Region'
          -
            Name: USER_POOL_ID
            Value: !ImportValue 'user-pool-id'
          -
            Name: SERVER_URL
            Value: !Join
              - ''
              -
                - !If [ IsProd, 'https://', 'http://' ]
                - !FindInMap [ Environments, !Ref Environment, ServerUrl ]
...

然后,当您构建应用程序时,您可以使用 CodeBuild 中的环境变量来创建 environment.js 文件,该文件作为可分发电子构建的一部分包含在内。