google 访问令牌每 1 小时就会过期,我如何每次都生成新的?

问题描述 投票:0回答:3

我正在开发 Google DialogFlow Api V2,我发现它在某种程度上令人困惑如何正确处理身份验证过程。

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

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

这说明它已激活,然后我运行

gcloud auth print-access-token
,它将打印出 访问令牌 ,并且我可以使用以下代码将此令牌传递到标头中:

    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 来获取访问令牌。

我希望有代码示例!

javascript google-api google-cloud-platform google-authentication dialogflow-es
3个回答
1
投票

考虑到设置正确的身份验证过程的安全隐患,建议尽可能使用客户端库,例如 NodeJS 库。

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

  1. 创建授权凭证。

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

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

  1. 创建授权请求

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

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

  4. 使用 刷新令牌 在过期时获取新的访问令牌。


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

0
投票

FWIW,我在类似的情况下成功使用了 OIDC (OpenID Connect) 令牌,其中 Google Could 任务是在队列中创建的,并且应该在创建后几天运行。问题是所有任务都运行了一小时,但在那之后就失败了。

示例代码:

from google.cloud import tasks_v2

headers = {'Content-Type': 'application/json',
                'Accept': 'application/json'}

task = {'http_request': 
            {  
                'http_method': tasks_v2.HttpMethod.POST, # Specify the type of request
                'url': 'https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME',  # The full url path that the request will be sent to.
                'headers': headers,
                'oidc_token': {
                    'service_account_email': '[email protected]'
                },
                'body': b'{"message": "Hello, World!"}'  # The payload of the HTTP request.
            }
        }

此配置告诉 Cloud Tasks 在进行 HTTP 调用之前为服务帐户获取新的 ID 令牌。

© www.soinside.com 2019 - 2024. All rights reserved.