Plsql PL/SQL中的Oracle APEX调用Dialogflow V2-使用OAuth2或Google服务帐户进行身份验证

Plsql PL/SQL中的Oracle APEX调用Dialogflow V2-使用OAuth2或Google服务帐户进行身份验证,plsql,oauth-2.0,dialogflow-es,oracle-apex,Plsql,Oauth 2.0,Dialogflow Es,Oracle Apex,从Dialogflow V1迁移意味着在客户端javascript中嵌入API密钥不再有效。相反,需要使用Google服务帐户进行身份验证(或者OAuth也可以工作?这方面还不清楚) 由于聊天机器人位于Blogger上,因此没有简单的方法添加使用Google Cloud SDK进行身份验证的服务器端代码 因此,请求需要通过Oracle APEX服务器进行路由,该服务器需要使用Dialogflow对自身进行身份验证。但是,我在以下程序中遇到困难: oauth\u身份验证失败,出现错误 s_in

从Dialogflow V1迁移意味着在客户端javascript中嵌入API密钥不再有效。相反,需要使用Google服务帐户进行身份验证(或者OAuth也可以工作?这方面还不清楚)

由于聊天机器人位于Blogger上,因此没有简单的方法添加使用Google Cloud SDK进行身份验证的服务器端代码

因此,请求需要通过Oracle APEX服务器进行路由,该服务器需要使用Dialogflow对自身进行身份验证。但是,我在以下程序中遇到困难:

oauth\u身份验证失败,出现错误

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;

创建或替换过程“测试流程”
是
开始
开始申报
l_响应_clob clob;
l_rest_url VARCHAR2(1000);
l_token_url VARCHAR2(1000);
l\u计数\u已过账请\u整数;
开始
l_rest_url:='https://dialogflow.googleapis.com/v2/projects//agent/sessions/0:detectIntent';
l_令牌\u url:='https://accounts.google.com/o/oauth2/token';
apex_web_service.oauth_认证(
p_客户机_id=>,
p_客户_机密=>,,
p_token_url=>l_token_url,
p_路径=>,,
p_钱包\u pwd=>
);
l\u response\u clob:=apex\u web\u服务。生成\u rest\u请求(
p_url=>l_rest_url,
p_http_方法=>'POST',
p_方案=>'OAUTH_客户端\u CRED',
p_body=>'{“queryInput”:{“text”:{“text”:“test”,“languageCode”:“en”}}},
p_路径=>,,
p_钱包\u pwd=>
);
htp.p('HTTP状态代码:'| | apex_web_service.g_状态_代码);
如果apex_web_service.g_status_code=200,则
parse(p_source=>l_response\u clob,p_strict=>true);
如果结束;
结束;
结束;
结束;
我怀疑令牌URL不正确。或者有一个更简单的方法来处理这个问题

我还怀疑GCloud内部的OAuth设置。这些必须填写吗


另外,我还不清楚谷歌服务账户与OAuth的对比。现在,设置是为我为Dialogflow制作的OAuth键。但是,建议使用服务帐户登录,但我不确定如何使用上述过程使用这些凭据登录。

如果要访问应用程序的用户数据,例如YouTube上的用户观看时间,则需要使用OAuth


通过阅读你的代码和评论,如果我没有弄错的话,你是在谷歌博客上实现聊天机器人,对吗?如果是这种情况,可以编写PHP代码来简化过程。您可以嵌入
并链接到您自己的服务器,您的服务器端代码可以在您的服务器中完成。我希望这会有所帮助。

尝试进入共享组件>Web凭据并创建OAuth2客户端凭据流类型的凭据。然后跳过对OAUTH\u AUTHENTICATE的调用,只需使用
p\u凭证\u静态\u id
p\u令牌\u url
参数调用
MAKE\u REST\u REQUEST