谷歌访问令牌每1小时到期,我怎样才能每次生成新的?

时间:2018-06-03 09:46:13

标签: javascript google-api google-cloud-platform google-authentication dialogflow

我正在使用Google DialogFlow Api V2,我发现它在某种程度上混淆了如何正确处理身份验证过程。

我已经将服务帐户密钥创建为json文件,然后运行以下命令:

gcloud auth activate-service-account --key-file="credentials.json"

说它已经激活然后我运行gcloud auth print-access-token会打印出访问令牌,这个令牌我可以使用下面的代码传递到Header中:

    fetch(configs.baseUrl + "query?v=20150910", {
        body: JSON.stringify({
           queryInput: {
              text: {
                text: "Hello",
                languageCode: "en-US"
              }
  }}),
        headers: {
            'content-type': 'application/json',
            "Authorization": "Bearer xxxx",
        },
        method: 'POST',
    })
        .then(response => response.json())
        .then(data => {
            console.log(data.result);
        })
        .catch(error => console.error(error))

在令牌到期之前,这将在1小时内正常工作,问题是我如何重新生成新令牌,因为我已经拥有 service-account-key-file.json 我能以某种方式从此信息重新生成访问令牌?

使用此客户端库https://github.com/dialogflow/dialogflow-nodejs-client-v2效果很好我不需要对访问令牌做任何事情但问题是我不想使用Node.js

是否有可能让我每次只使用javascript和我生成的service-account-key-file.json过期时设法获取访问令牌。

我很感激代码示例!

2 个答案:

答案 0 :(得分:0)

鉴于设置正确的身份验证过程的安全性,建议尽可能使用客户端库,例如NodeJS库。

但是,如果您想自己实施此过程,可以查看this guide,其中介绍了如何为Web服务器应用程序设置OAuth 2.0。步骤如下,您可以在指南中找到HTTP / REST请求和响应示例:

  1. 创建授权凭证。

  2. 标识访问范围:根据DialgoFlow API documentation,您的应用程序需要访问的资源所需的访问范围为:

https://www.googleapis.com/auth/cloud-platform

  1. 创建授权请求

  2. 手动授予对您的应用程序的访问权限(仅一次)。

  3. 获取刷新和访问令牌。

  4. 使用refresh token获取过期的新访问令牌。

答案 1 :(得分:0)

您可以使用以下方法生成令牌

import { dialogflowConfig } from './config/dialogflowConfig';
import { TokenCache } from 'google-oauth-jwt';

function generateAccessToken() {
  return new Promise((resolve, reject) => {
    const tokens = new TokenCache();
    tokens.get({
      // client_email from .json file 
      email: dialogflowConfig.client_email,
      // private key from .json file
      key: dialogflowConfig.private_key,
      // you can put scope ['https://www.googleapis.com/auth/cloud-platform']
      scopes: dialogflowConfig.scopes
    }, function (err, token) {
      if(err){
        reject(err);
      }
        resolve(token);
    });
  });
}