【问题标题】:Oracle APEX call Dialogflow V2 in PL/SQL - Authentication with OAuth2 or Google Service AccountOracle APEX 在 PL/SQL 中调用 Dialogflow V2 - 使用 OAuth2 或 Google 服务帐户进行身份验证
【发布时间】: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_idp_token_url 参数调用MAKE_REST_REQUEST

标签: plsql oauth-2.0 dialogflow-es oracle-apex


【解决方案1】:

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

通过阅读您的代码和评论,如果我没记错的话,您正在 Google Blogger 上实现聊天机器人,对吧?如果是这种情况,您可以编写 PHP 代码来简化该过程。您可以嵌入&lt;iframe&gt; 并链接到您自己的服务器,您的服务器端代码可以在您的服务器中完成。我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2015-09-16
    • 2020-05-21
    • 2020-07-21
    • 1970-01-01
    • 2016-01-31
    • 2015-03-13
    相关资源
    最近更新 更多