我正在开发 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 来获取访问令牌。
我希望有代码示例!
考虑到设置正确的身份验证过程的安全隐患,建议尽可能使用客户端库,例如 NodeJS 库。
但是,如果您想自己实现此过程,您可以查看本指南,其中解释了如何为 Web 服务器应用程序设置 OAuth 2.0。步骤如下,您可以在指南中找到 HTTP/REST 请求和响应示例:
创建授权凭证。
识别访问范围:您的应用程序需要访问的资源,根据DialgoFlow API文档,所需的访问范围为:
https://www.googleapis.com/auth/cloud-platform
创建授权请求
手动授予对您的应用程序的访问权限(仅一次)。
获取刷新和访问令牌。
使用 刷新令牌 在过期时获取新的访问令牌。
您可以使用以下方式生成令牌
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);
});
});
}
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 令牌。