
作为一个开发者的倡导者,我做了很多演示项目来说明我的讲座或内容。另外,作为一个混乱的人,我在演示过程中并没有做好安全存储环境变量的工作。不止一次,我在流媒体或会议演讲中暴露了我的环境变量。幸运的是,像和这样的开发者朋友向我介绍了Cloak,这是一个VS Code扩展,可以在你不小心分享你的屏幕时隐藏你的环境变量的值。
我最近开发了一个小应用程序,住在GitHub域。开发这个应用程序让我想起了我以前作为软件工程师时的所有挣扎。(我并不怀念在最后期限前编码的压力)。我遇到的挣扎之一是与合作者分享我的环境变量。我希望我的队友能在本地试用这个应用程序,这样他们就可以贡献代码或审查用户体验,但我不确定如何告诉他们安全地设置环境变量。
我过去经历过的其他失误:
我相信有很多解决方案可以在沙盒应用程序中安全地存储环境变量,但GitHub Codespaces对我来说是最有效的!
使用GitHub Codespaces的体验是无缝的,因为它允许仓库合作者去我的仓库,打开Codespaces,并在本地运行代码。他们不需要填写数值,所以我也不需要明确地分享秘密。在幕后,GitHub Codespaces 从仓库设置中的一个名为 Codespaces Secrets 的存储中提取这些值。
为了说明这个例子,我们将使用NASA的API,因为大多数开发者都能访问它。
填写 上的表格,申请一个 API 密钥。你应该在你的电子邮件中收到API密钥。(保存这个密钥,因为我们将在Step 5使用它)。
包括一些最常见的应用程序框架的模板代码,包括Next.js、React.js、Django、Express、Ruby on Rails、Preact、Flask和Jupyter Notebook。模板为开发者提供了一个沙盒,在Codespaces中构建、测试和调试应用程序。这意味着你不必从头开始进行编码。我们已经有了一个工作项目,你可以将其提升为你所设想的项目。你可以使用模板来了解开发人员如何结构他们用各种编程语言编写的项目。而且你可以用它来了解不同的文件是如何相互沟通的。
例如,我一直想学习更多关于人工智能和机器学习的知识,但我不知道从哪里开始。我使用一个Jupyter Notebooks模板来。该模板已经有了我需要的所有工具;我只需要修改几行代码。
在本教程中,我们将导航到https://github.com/codespaces/templates,并选择React模板。

一旦我们的Codespace被完全加载,你会在一个名为 “Simple Browser” 的标签上看到你的 *** 应用的实时预览。(如果你还没有看到 “Simple Browser” 标签,请给它几分钟时间来加载)。它应该看起来像下面的图片:

我们还没有完成。我们的主要目标是在Codespace中存储和引用环境变量。然而,只有当我们的Codespace生活在一个资源库中时,我们才能做到这一点。要做到这一点,我们需要发布我们的Codespace。采取以下步骤来发布当前的Codespace:




在你的新版本库中,导航到Settings > Secrets and variables > Codespaces。你也可以通过导航到一个类似这样的URL来找到正确的页面: https://github.com/REPLACE_WITH_GITHUB_OWNER/REPLACE_WITH_GITHUB_REPO/settings/secrets/codespaces
你登陆的页面应该如下图所示:

让我们创建两个版本库的私钥:
REACT_APP_NASA_ENDPOINT=https://api.nasa.gov/REACT_APP_NASA_API_KEY= This is where you will add your NASA API key现在,我们可以使用惯例在我们的代码库中引用这些变量: process.env.{ENVIRONMENT_VARIABLE_NAME}
一旦你添加了新的API密钥,你的Codespaces应该 “Auto” 认识到你向你的Codespaces添加了新的秘密。如果是这样,你的Codespaces将弹出一个通知,说:”Your codespace secrets have changed. Reload to apply。”
按下 “Reload to apply” 按钮,这些变化就会生效。

Axios是我们用来调用NASA API的npm包。在你的Codespace的终端运行这个命令来安装axios:
npm install --save axios
(这一步我使用了Wayne Fornworth在Medium上的。我过去曾使用过NASA的API,但在建立这个文件时,我觉得有点偷懒。谢谢你,韦恩,谢谢你的博文! )
在你的src目录下创建一个文件,名为 HttpClient.js ,然后在该文件中添加以下几行代码:
(注意:第2行和第3行是指我们通过使用 process.env.{ENVIRONMENT_VARIABLE_NAME} 创建的私钥。)
import axios from "axios"
const nasaEndpoint = process.env.REACT_APP_NASA_ENDPOINT
const nasaApiKey = process.env.REACT_APP_NASA_API_KEY
axios.interceptors.request.use(
config => {
config.params = config.params ? config.params : {}
const configUrl = config.url
if (configUrl.includes(nasaEndpoint)) {
config.params["api_key"] = nasaApiKey
}
return config
},
error => {
return Promise.reject(error)
}
)
export default {
getApod() {
return axios.get(`${nasaEndpoint}planetary/apod`)
},
}
删除 src/App.js 文件的当前内容,用以下几行代码替换它:
import React, { useState, useEffect } from "react"
import HttpClient from "./HttpClient"
const App = () => {
const [apod, setApod] = useState({})
useEffect(() => {
HttpClient.getApod().then(apodData => {
setApod(apodData.data)
})
}, [])
return (
<div style={{ maxWidth: 900, padding: 30 }}>
<h1>NASA API</h1>
<h2>Astronomy Picture of the Day</h2>
{apod && (
<article>
<header>
{apod.title} - <i>{apod.date}</i>
</header>
<img src={apod.url} alt="APOD" width="800" height="auto" />
<p>{apod.explanation}</p>
<pre
style={{
overflowX: "auto",
whiteSpace: "pre-wrap",
wordWrap: "break-word",
}}
>
<hr />
{ *** ON.stringify(apod, null, 2)}
</pre>
</article>
)}
</div>
)
}
export default App
如果成功的话,你的简单的浏览器标签应该呈现出与下面类似的图像:

任何人都可以打开你的Codespace,但环境变量不会对所有人都有效。为了让人们看到同样的结果(比如,为了让API调用发挥作用),你需要把用户添加为版本库合作者。如果他们不是版本库的合作者,他们会说页面上有一个破碎的图像。查看,了解如何为你的版本库添加合作者。

(via )
宝塔面板现在已经成为国内许多站长必备的服务器管理必备工具。相比直接使用SSH+FTP来管理服务器,宝塔面板可以提供可视化管理,包括文件管理、数据库管理、数据备份、SSL配置等等。 如果你希望更简单高效地管理您的网站及服务器,宝塔面板是不错的选择。下面是一些宝塔面板安装及常见问题:...
宝塔面板中的网站管理是非常重要的一部分,也是站长经常需要使用到的功能模块。网站管理,主要用于管理和创建WEB站点。如果您是宝塔面板的使用用户,应该对此模块有充分的了解,以便于您更高效地管理网站。 宝塔面板网站管理模块包括:添加新网站、修改默认页、设置默认站点、站点列表、站点的运行与停止、备份站点、...
每台连接到Internet的计算机都有一个Internet协议 (IP) 地址。但是,并非所有IP地址的外观或行为都相同。 如果您使用计算机网络或服务器,了解动态IP和静态IP之间的区别至关重要。通过详细了解每个协议,您可以选择最适合您需求的解决方案。 在本文中,我们将讨论静态和动态IP之间...
宝塔面板设置主要涉及的是宝塔控制后台自身的参数,包括诸如面板的开关、自动更新及SSL、面板端口设置等。虽然这部分不涉及服务器自身的管理,但对宝塔面板的设置也有其重要。 特别是面板端口、安全入口及面板密码等涉及安全的参数设置。 启动和关闭面板 如果你长时间无需使用到宝塔面板,可以考虑...
JavaScript是世界上最流行的编程语言之一。今天,它为数百万个网站提供支持,并吸引了成群的开发人员和设计人员为Web构建功能。如果您是编程新手,那么 JavaScript很容易成为之一。 在最初的20年里,JavaScript主要用于客户端脚本。由于JavaScript只能在<scr...
由于市场上有各种可用的数据库,用户经常会就MongoDB与MySQL进行辩论,以找出更好的选择。 使用MySQL等关系数据库的组织在根据不断变化的需求管理和存储数据时可能会面临一定的困难。同时,新公司想知道选择什么数据库,这样他们就不会在开发过程中遇到问题。 同时,构建金融应用程序的开发人员...