如何从 Lambda AWS 验证 Google API?

Posted

技术标签:

【中文标题】如何从 Lambda AWS 验证 Google API?【英文标题】:How to oAuth Google API from Lambda AWS? 【发布时间】:2017-06-29 10:59:38 【问题描述】:

我正在为 Google 日历构建 Alexa Skill。客户端代码在本地机器上按预期工作,因为我可以使用链接对本地机器进行身份验证。但是,当我在 AWS Lambda 上部署代码时,我无法进行身份验证,因为我无法通过 AWS 控制台输入代码。

我在设置 Google Calendar API 的身份验证时遇到问题 当部署在 AWS lambda 上时。

此文档对我没有多大帮助 Google Implementing Server Side Authentication

【问题讨论】:

【参考方案1】:

您应该创建一个服务帐户。这些是专为服务器到服务器通信而设计的。文档可以在这里找到:https://developers.google.com/identity/protocols/OAuth2ServiceAccount

其他答案的解决方案的问题是:

API 密钥不安全 访问令牌(例如,通过 CLI 命令 gcloud auth print-access-token 获得)过期。由于 Lambda 是无状态的,因此无法临时存储令牌并在令牌过期时对其进行刷新。

【讨论】:

【参考方案2】:

我知道这已经很晚了,但是在解决了这个问题之后,我找到了解决方案。使用 JWT 进行 google 身份验证

const google = require('googleapis');


const key =
 client_email: process.env.CLIENT_EMAIL,
 private_key: process.env.PRIVATE_KEY,


const auth = new google.auth.JWT(
  key.client_email,
  null,
  key.private_key,
  ["https://www.googleapis.com/auth/analytics.readonly"],
  null
);

google.options(auth);

【讨论】:

【参考方案3】:

您必须执行here 中指定的两个步骤,如果您正确执行,您将完成此操作。

首先,(仅第一次)您需要设置项目并下载GOOGLE APPLICATION CREDENTIALS,您将得到一个包含身份验证信息的 json 文件,假设您将其命名为 project.json

现在您需要执行一些命令来获取访问令牌,下载并安装 Cloud SDK 以访问这些命令。

 gcloud auth activate-service-account --key-file=/home/panchicore/project.json

然后

gcloud auth print-access-token

此时您将获得您的密钥,现在我们可以在下一步中使用它:

第二,提出翻译API请求:(我是怎么做的,用python请求测试过)

import requests

key = "KEY GOT WITH gcloud auth print-access-token"

headers = 
    'Content-Type': 'application/json',
    'Authorization': 'Bearer '.format(key)


url = 'https://translation.googleapis.com/language/translate/v2'

data = 
  'q': 'The quick brown fox jumped over the lazy dog.',
  'source': 'en',
  'target': 'es',
  'format': 'text'


res = requests.post(url, json=data, headers=headers)

print res.content
>>> El rápido zorro marrón saltó sobre el perro perezoso.

希望对您有所帮助。

【讨论】:

该令牌会永远有效,还是仅在有限的时间内有效? 之前没有,现在它们过期了,日期随gcloud 回复。 巴特,这在我之前的评论中是否认的。 @panchicore,尝试了您的解决方案。如前所述,工作了一段时间,然后密钥过期。您是否有无需导入 google cloud sdk 即可为 Lambda 函数生成身份验证令牌的解决方案? 2种方式:正确的一种:从谷歌授权服务器获取访问令牌。 developers.google.com/identity/protocols/OAuth2。以及精心设计的:运行例程的bash脚本,使用gcloud auth print-access-token获取密钥并将其发布到带有到期标志的安全dynamodb表中,每次运行脚本的cronjob都会查询该标志(基本上充当缓存)。 【参考方案4】:

我有多个 lambda,取决于相同的 google 凭据和令牌。

我将凭据存储在 S3 或 DynamoDB 中。

我的解决方案是创建一个计划的 lambda 函数,该函数每 55 分钟刷新一次 oAuth 令牌。如果同时运行多个 lambda,这可以防止不必要的刷新。

【讨论】:

【参考方案5】:

更简单的方法是使用 api 密钥进行身份验证。 https://cloud.google.com/docs/authentication/api-keys

您可以像这样 (javascript) 向某些 google api 发出请求

const request = require('request')
request.post(`https://language.googleapis.com/v1beta2/documents:analyzeSentiment?key=$process.env.GOOGLE_API_KEY || ''`, 

    json : true,
    body : 
        document : document
    
,
(error, response, body) => 
    console.log(body)
)

【讨论】:

API 密钥不安全,许多 Google API 不再支持它们。

以上是关于如何从 Lambda AWS 验证 Google API?的主要内容,如果未能解决你的问题,请参考以下文章

当 AWS AppSync 使用 Cognito 时如何验证 Lambda 生成的突变

如何使用 Java + ChromeDriver 在 AWS Lambda 中运行 Google Chrome 进行 Selenium 测试

如何将 jQuery Validate 与我的 aws lambda 函数集成?

python 使用AWS Lambda存取Google表格

在 aws lambda 上使用 opensearch-py 进行 opensearch 身份验证

具有 Cognito 身份验证的 AWS API Gateway Lambda 函数返回 415 Unsupported Media Type