我正在为谷歌日历构建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)
})