【问题标题】:Add auth to Oozie workflow notification将身份验证添加到 Oozie 工作流通知
【发布时间】:2016-07-25 12:23:31
【问题描述】:

Apache Oozie 具有 oozie.wf.workflow.notification.url 属性来通知自定义端点有关作业状态更新。

<property>
    <name>oozie.wf.workflow.notification.url</name>
    <value>http://SERVER:8080/endpoint/oozieUpdate?jobId=$jobId%26status=$status</value>
</property>

我有一个用例,其中端点必须对传入请求进行身份验证,但我找不到允许我配置 Oozie 以便它将身份验证标头发送到此通知 URL(例如基本身份验证)的解决方案。有没有办法做到这一点?

【问题讨论】:

    标签: apache hadoop oozie oozie-coordinator


    【解决方案1】:

    我怀疑在 oozie 的当前状态下使用 oozie.wf.workflow.notification.url 可以做到这一点。我检查了oozie source code 并发现了这个:

    org.apache.oozie.client.OozieClient(在常量中读取属性):

    public static final String WORKFLOW_NOTIFICATION_URL = "oozie.wf.workflow.notification.url";
    

    org.apache.oozie.command.wf.WorkflowNotificationXCommand(该常量用于构成proxyConf变量):

    public WorkflowNotificationXCommand(WorkflowJobBean workflow) {
        super("job.notification", "job.notification", 0);
        ParamChecker.notNull(workflow, "workflow");
        jobId = workflow.getId();
        url = workflow.getWorkflowInstance().getConf().get(OozieClient.WORKFLOW_NOTIFICATION_URL);
        if (url != null) {
            url = url.replaceAll(JOB_ID_PATTERN, workflow.getId());
            url = url.replaceAll(STATUS_PATTERN, workflow.getStatus().toString());
            proxyConf = workflow.getWorkflowInstance().getConf()
                    .get(OozieClient.WORKFLOW_NOTIFICATION_PROXY, ConfigurationService.get(NOTIFICATION_PROXY_KEY));
            LOG.debug("Proxy :" + proxyConf);
        }
    }
    

    org.apache.oozie.command.NotificationXCommand(使用 proxyConf 变量在 WorkflowNotificationXCommand 的超类中调用自身):

    protected void sendNotification() {
        if (url != null) {
            Proxy proxy = getProxy(proxyConf);
            try {
                URL url = new URL(this.url);
                HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(proxy);
                urlConn.setConnectTimeout(getTimeOut());
                urlConn.setReadTimeout(getTimeOut());
                if (urlConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
                    handleRetry();
                }
            }
            catch (IOException ex) {
                handleRetry();
            }
        }
        else {
            LOG.info("No Notification URL is defined. Therefore nothing to notify for job " + jobId);
    
        }
    
    }
    

    如您所见,此处没有使用httpURLConnection.setRequestProperty(,) 设置标题。

    您可以使用自定义 java 操作来解决问题,您可以使用任何您喜欢的标头从中进行 http 调用。

    【讨论】:

      【解决方案2】:

      作为一种解决方法,我为通知 url 创建了一个替换变量。

      <property>
          <name>oozie.wf.workflow.notification.url</name>
          <value>_NOTIFICATION_URL_</value>
      </property>
      

      然后,每次运行作业时,我都会在 url 中包含不同的密钥。

      confXml.replaceAll("_NOTIFICATION_URL_", server + "/" + getRandomSecret());
      

      这种情况下的信任锚是 HTTPS。当我收到来自作业的通知时,我可以通过比较密钥来确保它不是来自攻击者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多