首页 > 解决方案 > 如何在本机反应(博览会)中保持我的钥匙安全?

问题描述

我有 3 个发布渠道 - dev、qa、prod。

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'会在 QA 频道中发布

标签: react-nativeexpo

解决方案


您可以使用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.

常量.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 中构建独立应用程序时,此设置有效,但将密钥交给用户可能不是最好的主意。


推荐阅读