Netlify的API密钥管理
#javascript #网络开发人员 #初学者 #netlify

这是一个教程,旨在帮助Junior Devs在NetLify平台上发布网站时正确管理其API键(或其他秘密)。

先决条件

  • HTML,CSS,JavaScript的基础知识
  • Vite,Vuejs和Axios的基本知识
  • VisualStudio代码的基本知识
  • 只有CLI的经验
  • github存储库
  • 如何在Netlify上部署网站
  • 网站/项目/Web应用程序已经部署在Netlify

您将学到什么(目录)

如何安装和使用NetLify CLI

这是整个教程中最简单的步骤之一。
从有关CLI的NetLify文档(您可以找到here),这是安装NetLify CLI所需的全部。耶! :)

npm install netlify-cli -g

现在,您可以使用netlify命令来管理您的本地网站。您也可以使用别名ntl节省一些时间:)

登录到Netlify

现在,您需要通过获得访问令牌来授权NetLify CLI。只需键入以下命令并授权应用程序:

ntl login

将您的本地环境链接到Netlify

如果您已经在Netlify上部署了网站,那么现在您只需要一起 link

您可以使用此命令来执行此操作:

ntl link

运行您的构建

使用以下命令,您可以使用NetLify CLI运行本地构建,以模拟NetLify上运行构建的行为:

ntl dev

如何设置和使用环境变量

如果您不熟悉.ENV文件和环境变量的概念,则可以参考此过度简化的定义只是为了了解基础:

.env文件只是一个包含变量的键/值对的纯文本文件。

env 环境的简短,因为此处定义的值是我们所有环境可用的变量。

设置环境变量

您可以通过在.env文件中写下这些变量来设置这些变量:

MY_KEY=value

注意:始终记住将.ENV文件添加到.gitignore或所有变量都在您的存储库中可见!

NetLify UI使编写和管理环境变量的过程非常容易。只需转到您的网站控制面板>> 站点设置>> 环境变量
写下键和值,留下所有范围可用的变量(在本教程中,我不会覆盖可变范围)。

注释:确保在上设置敏感变量策略需要批准对不受信任的部署!
有关here的更多信息。

如果将本地开发环境链接到NetLify网站,则已经具有可用的环境变量,而无需编写.ENV文件!

您可以通过执行以下命令来验证这一点:

ntl env:list

使用环境变量

要使用环境变量,这就是您所需要的:

const { SECRET_API_KEY } = process.env

process.env获取所有环境变量,并使用简单的破坏性您可以获得所需的键。

这就是环境变量的全部!
不用担心!在接下来的步骤中,我将向您展示在哪里放置此代码线:)

如何编写无服务器功能

NetLify上的无服务器功能只是返回承诺的JS功能。根据Netlify文档:
要创建同步函数,请使用JavaScript功能文件中的以下一般语法导出处理程序方法

exports.handler = async function (event, context) {
  // your server-side functionality
};

您也可以使用ES模块语法:

const handler = async function (event, context) {
  // your server-side functionality
};

export { handler };

注意
netlify调用函数时提供事件和上下文参数。
有关该here

的更多信息

在哪里放置无服务器功能

NetLify用于无服务器功能的默认路径是YOUR_BASE_DIRECTORY/netlify/functions

注意
该函数的端点名称为 case敏感,并由其文件名或其专用父目录的名称确定。

即。如果您想要一个名称hello的端点,则应以以下方式保存您的功能:

  • netlify/functions/hello.js
  • netlify/functions/hello/hello.js
  • netlify/functions/hello/index.js

因为端点名称为 case敏感如果您将函数命名为myFunction,则您的端点将看起来像:netlify/functions/myFunction.js
出于相同的原因,如果您将函数命名为my-function,则您的端点将是:netlify/functions/my-function.js

在功能中写什么

最简单的事情就是使功能返回“ Hello World!”
使用Netlify documentation的基本示例,hello.js函数将看起来像这样:

const handler = async function (event, context) {
    // your server-side functionality
    return {
        statusCode: 200,
        body: JSON.stringify({ message: "Hello World" }),
    };
};

export { handler };

这将返回具有statusCodebody属性的对象。具有Value 200statusCode表示请求成功。
body将包含一个代表我们要从功能获得的对象的JSON格式字符串。在此示例中,只是一个具有message属性的对象。

让我们继续下一步!

如何使用无服务器功能与API通信

是时候使用您的功能了!
成功进行测试调用后,您将添加需要调用所需API端点所需的代码。

调用功能

以下代码示例来自VUEJS项目,使用axios调用无服务器功能和API。

App.vue调用hello.js,代码很简单:

axios.get('/.netlify/functions/hello')
    .then((response) => {
        // handle success
        console.log(response);
        this.helloResult = response.data.message;
    })
    .catch((error) => {
        // handle error
        console.log(error);
    });

如果您对Vuejs有点熟悉,您会知道可以将此代码放置在methods属性中定义的函数或mounted方法中。
helloResult只是data的属性,用于记住从hello.js函数返回的值。

注意
获得“ Hello World!”您需要访问response.data内的message属性。
message属性与您在previous step中定义的属性相同

确保在浏览器中测试您的代码(请记住在终端运行ntl devnetlify dev,以在Run your build步骤中启动NetLify本地环境和项目启动和运行)

如果您本地机器上的所有功能都可以推送到您的存储库并再次测试您的现场网站上的所有内容!

从无服务器函数中读取环境变量

您刚刚测试了您可以编写的最简单功能,一切顺利进行!要对您想要的API进行安全呼叫,您首先需要从您的 api键 环境变量。。。

您还记得this step吗?在这里,您可以在哪里找到该行的代码!

转到Set environment variables步骤,创建一个新变量,称为SECRET_API_KEY(扰流板:它不会是秘密!)。

在您的本地计算机上运行命令以获取所有环境变量的列表:

ntl env:list

如果您可以看到SECRET_API_KEY条目,那么您做对了!

注意
您还可以通过键入y来检查变量值:显示值?(y/n)

现在是创建一个称为almost-secret.js的新功能的时候,它将为您提供SECRET_API_KEY Envibal的值。

almost-secret.js代码:

const handler = async function (event, context) {
    // your server-side functionality
    const { SECRET_API_KEY } = process.env
    return {
        statusCode: 200,
        body: JSON.stringify({ message: SECRET_API_KEY }),
    };
};

export { handler };

调用此功能将为您提供SECRET_API_KEY变量的值...但是,等等...为什么要带上前端此类信息?

你不应该!这只是一个示例,可以显示如何从无服务器函数中读取和使用env变量。
在下一个示例中,您将看到如何正确使用无服务器函数来调用API而不公开API密钥。

在此之前,让我们推开存储库上的所有内容并在实时网站上进行检查。

牢固致电Quizapi通过API密钥

在最后一个示例中,您将学习如何将它们全部放在一起并向您需要的每个API拨打安全的电话。
使用的API来自QuizAPI。在他们的文档中,他们建议将API密钥附加为HTTP header

X-Api-Key: YOUR_API_KEY

注册到QuizAPI并获取您的API密钥,然后将该键添加到Netlify上的新ENV变量(Es。QUIZ_API_TOKEN)。
最后要做的是创建一个称为quizapi.js的新功能。此功能将调用questions端点(更多有关here)。

要从无服务器函数进行HTTP调用,您需要导入axios(您已经在上一步中安装了依赖项)。

注意
我不会介绍如何使用axios以及如何将标题添加到请求中,因为它是遵循此教程的先决条件

让我们看一下quizapi.js函数:

import axios from 'axios';

const handler = async function (event, context) {
    try {

        // your server-side functionality
        const { QUIZ_API_TOKEN } = process.env;

        const config = {
            params: {
                limit: 1
            },
            headers: {
                "X-Api-Key": QUIZ_API_TOKEN
            }
        };

        const response = await axios.get('https://quizapi.io/api/v1/questions', config)

        if (response.errors !== undefined && response.errors.length) {
            throw new Error(response.errors);
        }

        // handle success
        return {
            statusCode: 200,
            body: JSON.stringify({ response: response.data }),
        };

    } catch (error) {
        return {
            statusCode: 500,
            // Could be a custom message or object i.e. JSON.stringify(err)
            body: JSON.stringify({ response: error.message }),
        }
    }
};

export { handler };

它比其他两个要复杂一些,是吗?
不用担心,我将几乎按行解释此功能。

第一行只是在功能中导入axios

import axios from 'axios';

在所有NetLify无服务器函数的通用代码之后,您可以发现行驶的行,以检索QUIZ_API_TOKEN Env Variable值:

const { QUIZ_API_TOKEN } = process.env;

之后,有用于将参数和标题添加到axios请求的代码:

const config = {
    params: {
        limit: 1
    },
    headers: {
        "X-Api-Key": QUIZ_API_TOKEN
    }
};

limit属性是从QuizAPI documentation
获取的参数 X-Api-Key属性是在QuizAPI documentation

上解释的QUIZ_API_TOKEN值的位置

该功能现在将呼叫API,沿参数和标题传递:

const response = await axios.get('https://quizapi.io/api/v1/questions', config)

如果API响应错误,则该函数将引发异常(这就是为什么所有内容都包裹在try/catch块中):

if (response.errors !== undefined && response.errors.length) {
    throw new Error(response.errors);
}

如果没有错误,该函数将返回您已经熟悉的对象:

return {
    statusCode: 200,
    body: JSON.stringify({ response: response.data }),
};

在响应属性中,我们添加了response.data的值,因为端点返回了axios放置在data属性中的一系列字符串(如果您熟悉axios,您已经知道如何检查此)。

)。

如果发生错误,该函数将转到catch块,并以500的statusCode(通用服务器错误)返回对象,并且错误消息:

catch (error) {
    return {
        statusCode: 500,
        // Could be a custom message or object i.e. JSON.stringify(err)
        body: JSON.stringify({ response: error.message }),
    }
}

App.vue(或任何其他组件)调用此函数该代码几乎与以前使用的函数相同:

axios.get('/.netlify/functions/quizapi')
    .then((response) => {
        // handle success
        console.log(response);
        this.quizApiQuestion = response.data.response[0].question;
    })
    .catch((error) => {
        // handle error
        console.log(error);
    });

测试当地机器上的呼叫

如果您没有停止本地环境,请转到浏览器,检查是否可以从Quizapi端点获得问题!
之后,进一步推动您的存储库上的所有内容,也可以测试实时网站的呼叫。

测试现场网站上的呼叫

如果您可以从现场网站的quizapi获得问题,太好!

如果没有,也许您正在面对这种错误:'Error: Cannot find module '/var/task/node_modules/axios/dist/node/axios.cjs'

解决此错误创建一个名为netlify.toml的文件,然后在其中添加此代码:

[functions]
  node_bundler = "esbuild"

提交,推动和测试!

结论

在您的前端项目调用外部API服务时,请记住要保留隐藏并保护您的API键(或其他敏感信息)。
一种方法是利用可以充当API端点,读取环境变量并拨打其他API的NetLify无服务器功能的功能。

如果本文有帮助或想开始对话,请在评论中或在LinkedIn中伸出援手
我很乐意收到有关未来文章和教程的任何反馈或想法。

资源