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

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

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

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

【问题讨论】:

    标签: google-calendar-api google-api-client alexa


    【解决方案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 不再支持它们。
          猜你喜欢
          • 1970-01-01
          • 2019-11-18
          • 2018-08-10
          • 2017-03-11
          • 1970-01-01
          • 2016-05-24
          • 2018-06-07
          • 1970-01-01
          • 2023-03-30
          相关资源
          最近更新 更多