首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Netlify Lambda函数隐藏API密钥

如何使用Netlify Lambda函数隐藏API密钥
EN

Stack Overflow用户
提问于 2019-08-02 16:56:52
回答 1查看 1.5K关注 0票数 3

我正在使用vanilla构建一个简单的应用程序,在该应用程序中,我检索用户的位置并将坐标传递给Google的地理定位API。我试图通过Netlify的UI将API键设置为环境变量,从而获得对API密钥的访问权,但我不太清楚如何实现lambda函数来完成任务。

我有一个函数,它获取用户的纬度/经度,并在DOM中显示数据之前从地理定位API中获取数据。到目前为止,我只有一个index.html和app.js文件。

代码语言:javascript
复制
getUserLocation();

function getUserLocation() {
  async function success(position) {
    const latitude = position.coords.latitude;
    const longitude = position.coords.longitude;
    const geoAPI = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}&key=${apiKey}`;

    const { city, state, country } = await getGeoData(geoAPI);

    updateWidget({ city, state, country });
  }

  function error() {
    alert("Unable to retrieve your location");
  }

  if (!navigator.geolocation) {
    console.log("Geolocation is not supported by your browser");
  } else {
    navigator.geolocation.getCurrentPosition(success, error);
  }
}

我试着阅读Netlify的文档,但我不知道如何实现我的简单项目的解决方案。任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-03 02:49:52

由于密钥是一个秘密密钥,我们将创建一个Netlify函数来调用https://maps.googleapis.com/maps/api/geocode/json,并且我们的站点上的端点将是/.netlify/functions/location

在这个例子中,我们将而不是使用节点工具创建构建包,因此我们将在函数中包含依赖模块node-fetch

在Netlify管理控制台上添加秘密api键

在变量MAP_GOOGLEAPIS_KEY中将秘密api键添加到站点上的环境变量中。

存储库项目结构

netlify.toml文件(构建配置):

我们实际上并没有进行任何构建,但是这将帮助我们在Netlify上配置我们的部署容器,从而知道我们的函数位于哪里。

代码语言:javascript
复制
[build]
  functions = "functions"
  publish = "site"
  command = "echo 'No build here yet!'"

functions/location/location.js函数码

代码语言:javascript
复制
const fetch = require('node-fetch');

const apiKey = process.env.MAP_GOOGLEAPIS_KEY;

exports.handler = async function(event, context) {
  try {
    const { latitude, longitude } = event.queryStringParameters || {};
    if (!latitude || !longitude) {
      return { statusCode: 400, body: "Missing query parameters" };
    }
    const uri = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}`;

    const response = await fetch(`${uri}&key=${apiKey}`);
    if (!response.ok) {
      // NOT res.status >= 200 && res.status < 300
      return { statusCode: response.status, body: response.statusText };
    }

    const data = await response.json();

    return {
      statusCode: 200,
      headers: { "content-type": "application/json" },
      body: JSON.stringify(data)
    };
  } catch (err) {
    console.log("invocation error:", err); // output to netlify function log
    return {
      statusCode: 500,
      body: err.message // Could be a custom message or object i.e. JSON.stringify(err)
    };
  }
};

客户端脚本的新端点调用

客户没有秘密钥匙!

代码语言:javascript
复制
function getUserLocation() {
  async function success(position) {
    const latitude = position.coords.latitude;
    const longitude = position.coords.longitude;
    const geoAPI = `/.netlify/functions/location?latitude=${latitude}&longitude=${longitude}`;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57330728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档