如何在React Native(Expo)中确保我的钥匙安全?

时间:2019-02-07 20:21:58

标签: react-native expo

我有3个发布渠道-开发人员,质量检查人员,产品人员。

const ENV_MODES = {
  dev: {

  },
  prod: {

  },
  qa: { 

  }
}

ENV_MODES.default = ENV_MODES.prod

const getEnvVars = channel => {
  if (process.env.NODE_ENV !== 'production') return ENV_MODES.dev
  if (channel === null || channel === undefined || channel === '') return ENV_MODES.prod
  if (channel.startsWith(ENV_DEV)) return ENV_MODES.dev
  if (channel.startsWith(ENV_QA)) return ENV_MODES.qa
  if (channel.startsWith(ENV_PROD)) return ENV_MODES.prod
  return ENV_MODES.default
}

const ENV = getEnvVars(Constants.manifest.releaseChannel)

但是我不想把密钥放到仓库中。 我该如何处理?据我了解,我不能指望在质量检查频道中发布NODE_ENV === 'qa'

1 个答案:

答案 0 :(得分:1)

您可以使用react-native-dotenv并将密钥添加到.env文件,然后将其添加到.gitignore。这样,您就无需将键推到您的存储库中,并且可以根据运行代码的环境来更改变量。

要使用该库,只需要将其添加到devDependencies并将其添加到babel.config.js文件中,就像这样:

module.exports = function (api) {
  api.cache(true);
  return {
    presets: [
      'babel-preset-expo',
      'module:react-native-dotenv',
    ],
  };
};

编辑

NODE_ENV与您的发布频道不同。如果要基于发布渠道加载配置,请使用Expo.Constants.manifest.releaseChannel

但是请记住,根据expo的文档,该变量在开发模式下不存在。

  

Expo.Constants.manifest.releaseChannel在开发人员模式下不存在。它确实存在,但是当您显式发布/构建它时。

编辑2:

下面是一个示例,说明如何为每个发布渠道实现两种单独的配置,以及如何使用react-native-dotenv避免将秘密推送到您的Git存储库(因为这很重要)。

记住:将.env文件添加到.gitignore

Constants.js

// eslint-disable-next-line import/no-extraneous-dependencies
import { AWS_KEY } from 'react-native-dotenv';
import { Constants as ExpoConstants } from 'expo';

const getChannelConfigs = (releaseChannel = '') => {
  switch (releaseChannel) {
    case 'qa':
      return {
        API_URL: 'https://qa.com/api',
        ...
      };

    case 'prod':
      return {
        API_URL: 'https://prod.com/api/',
        ...
      };

    default:
      return {
        API_URL: 'https://dev.com/api/',
        ...
      };
  }
};

const CHANNEL_CONFIGS = Object.freeze(getChannelConfigs(ExpoConstants.manifest.releaseChannel));

export default { AWS_KEY, CHANNEL_CONFIGS };

.env

AWS_KEY='superSecretKeyDoNOTStealThx'

在此示例中,我们根据应用的发布渠道配置应用将调用的API URL。我们还避免将密钥提交给Git存储库,因为现在我们将其保存在舒适的.env文件中。

值得一提的是,在CI中构建独立应用程序时,此设置有效,但是将密钥交给用户可能不是最好的主意。