【问题标题】:how to access aws credentials info from credentials file within the browser to retrieve secrets from secrets manager -Cypress如何从浏览器中的凭证文件中访问 aws 凭证信息以从秘密管理器-赛普拉斯检索秘密
【发布时间】:2020-12-06 21:41:10
【问题描述】:

我的本​​地 Windows 机器中有 aws 凭据文件和配置文件。 使用下面的 javascript 代码,我可以从包含用户名和密码的 aws 秘密管理器获取秘密。但问题是,我的代码通过 cypress 在浏览器中运行,它无法从我的本地访问 aws 凭证文件。因此,如您所见,我已经硬编码了我的 aws 凭据信息来获取它。

我的问题是,如何从本地访问 aws 凭据文件,以便摆脱硬编码令牌?请告知

\.aws\credentials 
[default] 
aws_access_key_id=<access key>
aws_secret_access_key= <secret key> 
aws_session_token=<session token>
aws_expiration=<datetime>

awssecretmanager.ts:

const AWS = require('aws-sdk');
const region = 'eu-central-1';
const secretName = 'secretname of my application';


const secretManager = new AWS.SecretsManager({
  region,
  accessKeyId : 'qbxx1234556', //hardcoded 
  secretAccessKey : 'axyx124545', //hardcoded
  sessionToken : 'x1234; //hardcoded
});

const getSecrets = async () => {
  return await new Promise((resolve, reject) => {
    secretManager.getSecretValue({ SecretId : secretName }, (err, result) => {
      if (err) { reject(err); }
      else { resolve(JSON.parse(result.SecretString)); }
    });
  });
};

const getSecret = async () => {
  const  secret  = await getSecrets();
  return secret; //secret contains username and password
};

export {getSecret};

如何从我的测试文件中访问它? test.spec.ts

  const secret = await getSecret();

  if (secret !== undefined){
    username = secret['username'];
    password = secret['password'];

我尝试使用以下代码,但由于浏览器无法访问本地凭据文件,它不起作用

const credentials = new AWS.SharedIniFileCredentials({ profile: "default" });
AWS.config.credentials = credentials;

【问题讨论】:

    标签: javascript aws-sdk cypress aws-secrets-manager


    【解决方案1】:

    有一个更简单的解决方法。

    1.由于我们将“Azure devops”用于 CI,因此我们可以更轻松地通过 Azure devops 管道任务从 AWS Secret Manager 获取机密。 2.一旦你得到秘密,我们设置环境变量,如CYPRESS_USERNAME,CYPRESS_PASSWORD 3. 在测试中,我们可以通过 Cypress.env('USERNAME') 和 Cypress.env('PASSWORD') 来引用环境变量

    第一步和第二步: 下面包含任务的 azure-pipeline.yml 文件

      jobs:
      - job: run_e2e_tests
        steps: 
        - task: SecretsManagerGetSecret@1
          displayName: Get AWS  secrets
          inputs:
            awsCredentials: 'aws credentials' 
            regionName: 'eu-central-1'
            secretIdOrName: 'secretname'
            variableName: 'variable-containing-secrets'
    
        - powershell: |
            $variablecontainingsecrets ='$(variable-containing-secrets)' | ConvertFrom-Json
            echo "##vso[task.setvariable variable=TestUsername;isOutput=true;issecret=true;]$($variablecontainingsecrets.'username')"
            echo "##vso[task.setvariable variable=TestPassword;isOutput=true;issecret=true;]$($variablecontainingsecrets.'password')"
          name: secrets
          displayName: Set environment variables from secrets JSON
    
    
        - task: PowerShell@2
          displayName: 'Setup environment variables for Cypress tests'
          inputs:
            targetType: 'inline'
            script: |
              Write-Host "##vso[task.setvariable variable=CYPRESS_USERNAME;]$(secrets.TestUsername)"
              Write-Host "About to set environment variable for username ($env:CYPRESS_USERNAME)"
              Write-Host "##vso[task.setvariable variable=CYPRESS_PASSWORD;]$(secrets.TestPassword)"
              Write-Host "About to set environment variable for password ($env:CYPRESS_PASSWORD)"

    第三步: 在 cypress 测试中,我们然后像这样引用 env 变量

      cy.get('input#signInFormUsername').type(Cypress.env('USERNAME'));
    

    请注意,如果您在本地运行它,您可能需要设置环境变量。例如,我需要设置像CYPRESS_USERNAME=username 这样的环境变量, CYPRESS_PASSWORD=password

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 2020-02-12
      • 2020-10-13
      • 2019-12-03
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2021-03-15
      相关资源
      最近更新 更多