【发布时间】:2020-03-16 19:18:47
【问题描述】:
从 Dialogflow V1 迁移意味着在客户端 JavaScript 中嵌入 API 密钥不再有效。相反,需要使用 Google 服务帐户进行身份验证(或者 OAuth 也可以使用?目前还不清楚)。
由于聊天机器人在 Blogger 上,因此没有简单的方法可以添加使用 Google Cloud SDK 进行身份验证的服务器端代码。
因此,请求需要通过我们的 Oracle APEX 服务器进行路由,该服务器需要使用 Dialogflow 对自身进行身份验证。但是,我在执行以下程序时遇到了困难:
https://docs.oracle.com/database/apex-5.1/AEAPI/OAUTH_AUTHENTICATE-Function.htm
https://docs.oracle.com/database/apex-18.1/AEAPI/MAKE_REST_REQUEST-Function.htm
oauth_authenticate 失败并出现错误
s_internal_error: true
apex_error_code: APEX.REGION.UNHANDLED_ERROR
ora_sqlcode: -20001
ora_sqlerrm: ORA-20001: Authentication failed. ORA-06512
这里是整体代码:
create or replace procedure "TEST_DIALOGFLOW"
is
begin
begin DECLARE
l_response_clob CLOB;
l_rest_url VARCHAR2(1000);
l_token_url VARCHAR2(1000);
l_count_posted PLS_INTEGER;
BEGIN
l_rest_url := 'https://dialogflow.googleapis.com/v2/projects/<project>/agent/sessions/0:detectIntent';
l_token_url := 'https://accounts.google.com/o/oauth2/token';
apex_web_service.oauth_authenticate(
p_client_id => <client id>,
p_client_secret => <client secret>,
p_token_url => l_token_url,
p_wallet_path => <wallet path>,
p_wallet_pwd => <wallet password>
);
l_response_clob := apex_web_service.make_rest_request(
p_url => l_rest_url,
p_http_method => 'POST',
p_scheme => 'OAUTH_CLIENT_CRED',
p_body => '{"queryInput":{"text":{"text":"test","languageCode":"en"}}}',
p_wallet_path => <wallet path>,
p_wallet_pwd => <wallet password>
);
htp.p('HTTP Status Code: '||apex_web_service.g_status_code);
IF apex_web_service.g_status_code = 200 THEN
apex_json.parse(p_source => l_response_clob, p_strict => true);
END IF;
END;
end;
end;
我怀疑令牌 URL 不正确。或者有更简单的方法来处理这个问题。
我也怀疑 GCloud 内部的 OAuth 设置。这些必须填写吗?
另外,我不清楚 Google 服务帐户与 OAuth 的区别。现在,设置是针对我为 Dialogflow 制作的 OAuth 密钥。但是,建议使用服务帐户,但我不确定如何使用上述过程使用这些凭据登录。
【问题讨论】:
-
尝试进入 Shared Components > Web Credentials 并创建一个 OAuth2 Client Credentials Flow 类型的凭证。然后跳过对
OAUTH_AUTHENTICATE的调用,只需使用p_credential_static_id和p_token_url参数调用MAKE_REST_REQUEST。
标签: plsql oauth-2.0 dialogflow-es oracle-apex