如何从 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 函数集成?
在 aws lambda 上使用 opensearch-py 进行 opensearch 身份验证
具有 Cognito 身份验证的 AWS API Gateway Lambda 函数返回 415 Unsupported Media Type