如何从 Lambda AWS 获得 oAuth Google API



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

我在设置谷歌日历API的身份验证时遇到问题在 AWS lambda 上部署时。

这个文档对我没有多大帮助谷歌实现服务器端身份验证

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

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

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

这已经晚了,但是在为这个问题挣扎了很多之后,我找到了解决方案。使用 JWT 进行谷歌身份验证

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});

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

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

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

您必须执行此处指定的 2 个步骤,如果您正确遵循,您将完成此操作。

首先,(只是第一次(您需要设置项目并下载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.

希望对您有所帮助。

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

你可以像这样向一些谷歌API发出请求(javascript(

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)
})

最新更新