如何在浏览器中获取Google Cloud Translation API的身份验证令牌(Chrome扩展程序)

时间:2018-08-18 03:30:25

标签: javascript google-chrome google-chrome-extension google-translate google-translation-api

我正在尝试制作一个使用Google Cloud Translation API的Chrome扩展程序。我在Google Translate和developing Chrome extensions的文档的许多不同页面上都遵循了一系列说明,但是我仍然不知道如何从浏览器中实际使用API​​。

我走得最远的是从Quickstart guide的以下部分开始,在该部分中创建服务帐户,获取服务帐户密钥文件(下载为.json文件),安装并初始化Google SDK,设置GOOGLE_APPLICATION_CREDENTIALS环境变量到服务帐户JSON密钥文件的路径,然后使用curl发出gcloud auth application-default print-access-token请求以获取要作为请求标头一部分输入的访问令牌: “授权:不记名(此处为令牌)”。以此方式成功检索了翻译。

但是在扩展程序的环境中,您无法运行诸如gcloud之类的命令,因此该命令不起作用。我能够使用gcloud命令手动检索访问令牌,然后将其作为请求标头的一部分粘贴到我的javascript代码中(例如xmlHttpRequest.setRequestHeader('Authorization', 'Bearer ya29.c.Elr6BRuTfOtherRandomLetters');)。但是该访问令牌会在60分钟后过期,因此无法持续工作。

我还尝试使用identity.getAuthToken方法(在文档说明的方式manifest.json中更新内容之后),但这没有用。将我的服务帐户客户ID用作client_idoauth2下的manifest.json会导致identity.getAuthToken出现“无效的客户ID”错误。另一方面,从Google控制台生成OAuth2客户端ID,并将{{1}下的myoauth2clientid.apps.googleusercontent.com用作client_id,将oauth2用作{{ 1}}导致["https://www.googleapis.com/auth/cloud-translation", "https://www.googleapis.com/auth/cloud-platform"]出现“未授予或撤销OAuth2”错误。

从Google控制台页面生成API密钥,然后直接将其用作我的翻译查询的scopes参数,甚至无法正常工作:我收到了“该请求缺少有效的API密钥”。错误。

我真的很茫然。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

我(第一次发布者)也经历了与您相同的步骤,但是在@magicnumber的答案的帮助下,我想出了一种解决方案,可以使用API​​key而不是APIkey来翻译Chrome扩展程序中的文本(从任何语言到英语)服务帐户密钥文件。

首先创建一个转换函数(我在这里使用了Async-> Await模式):

 async function translate(strSourceText,strApiKey)
  {
    var url = `https://translation.googleapis.com/language/translate/v2?key=${strApiKey}`
    let response = await fetch(url, {
      method: 'POST',
      headers : { 
        'Content-Type': 'application/json',
       },
       body: JSON.stringify({
         target: "en",
         format: "text",
         q: strSourceText
       }),
    }); 
    let data = await response.json()
    return data;
  }

然后调用异步函数,该函数将返回一个承诺,例如:

query="כלב" //Hebrew word for dog ?

translate(query,  "YOURVALIDAPIKEYGOESHERE")
  .then(response => console.log(response.data))
  .catch(reason => console.log(reason.message));

Google Translation API的响应应类似于:

{
  "data": {
    "translations": [
      {
        "translatedText": "Dog",
        "detectedSourceLanguage": "iw"
      }
    ]
  }
}

最后,为了避免违反内容安全策略,我不得不在我扩展程序的manifest.json文件的权限密钥中添加翻译API域:

"permissions": ["https://translation.googleapis.com/language/translate/v2/*"],

答案 1 :(得分:1)

我完成了与您相同的步骤,也不能依赖gcloud进行身份验证。

使我摆脱“请求缺少有效的API密钥”错误的原因是使用此处https://codelabs.developers.google.com/codelabs/cloud-translation-intro/index.html#5

所述的查询语法

在我的情况下,我使用了:

then