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