如何在 PHP 内从 CURL 调用 SAS 存储过程?

How can I call a SAS Stored Process from CURL within PHP?

我想构建一个调用 SAS 存储过程并打印结果的 Web 应用程序。我希望在后台处理身份验证。

Web 应用程序内置于 PHP 中,我将使用 CURL 发出请求。

这可能吗?需要哪些 CURL 选项?

首先确保按照位于 here.

的说明正确配置存储过程 Web 服务器

创建一个包含以下代码的 .php 文件。

<?php

  $parameters = array('_program'  => '/Products/SAS Intelligence Platform/Samples/Sample: Hello World',  // PATH TO STORED PROCESS
                      '_username' => 'mysasusername',
                      '_password' => '{SAS002}EFC0A34D034F489E2E0E03E840D324D6D30964A3', // ENCODED PASSWORD FROM PROC PWENCODE
                      'myParam1'  => 'abc',
                      'myParam2'  => 123
                     );

  //
  // CREATE A NEW CURL INSTANCE AND CONFIGURE IT
  //  
  $ch = curl_init(); 
  curl_setopt($ch, CURLOPT_URL, "http://sas.myserver.com/SASStoredProcess/do?");
  curl_setopt($ch, CURLOPT_PORT, 7980);  // PORT USED TO MAKE STORED PROCESS REQUESTS
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // DISABLE SSL CERTIFICATE CHECKING - OPTIONAL DEPENDING ON SERVER CERTIFICATE
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // DISABLE SSL CERTIFICATE CHECKING - OPTIONAL DEPENDING ON SERVER CERTIFICATE

  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // STORED PROCESS LOGIN INVOLVES MULTIPLE PAGE REQUESTS
  curl_setopt($ch, CURLOPT_COOKIEFILE, ""); // STORED PROCESS LOGIN REQUIRES COOKIES 
  curl_setopt($ch, CURLOPT_COOKIEJAR, ""); // STORED PROCESS LOGIN REQUIRES COOKIES
  curl_setopt($ch, CURLOPT_HEADER, true);  // DONT SUPPRESS HTTP HEADER INFO 

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // SUPPRESS DIRECTLY PRINTING RESULTS WHEN CURL_EXEC IS RUN.
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,90); // TIMEOUT LIMIT WHILE TRYING TO CONNECT
  curl_setopt($ch, CURLOPT_TIMEOUT, 90); // TIMEOUT WHILE WAITING FOR RESPONSE
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parameters)); // SET THIS OPTION LAST.  MUST USE HTTP_BUILD_QUERY CALL ELSE YOU WILL BE PRESENTED WITH LOGIN PAGE

  //
  // EXECUTE IS AND SAVE THE RESULTS THEN CLOSE THE CURL OBJECT
  //    
  $response = curl_exec($ch) ; 

  // 
  // PARSE OUT THE HTTP HEADER VS THE BODY
  //
  $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
  $header = substr($response, 0, $header_size);
  $body = substr($response, $header_size);  

  print $body;

  curl_close($ch);   

?>

配置如下:

  • _用户名
  • _密码
  • _program(对于这个例子,我使用了 SAS 附带的示例)
  • CURLOPT_URL
  • CURLOPT_PORT
  • 根据您的网站架构,您可能需要额外的 CURL 选项,但以上应该足以满足大多数情况

配置完成后,将 .php 文件的 URL 输入浏览器的地址栏。您应该看到输出:

Hello World!

列出的 PHP 代码使用了工作所需的最少选项数。它假定在​​某些时候您可能还想解析 header 数据以确定结果的 CONTENT-TYPE。

此外,在实施上述代码时,请确保安全存储所有用户凭据。将用户凭据硬编码到源代码中绝不是一个好主意(即使 SAS 密码已通过 PWENCODE 运行)。

对于通用(非php,命令行)答案,这里是一个单行。

curl -v -L -c cookiefile -b cookiefile \ 
    -d "_program=$STP&_username=$USERNAME&_password=$PASSWORD" \
    https://yourdomain.com/SASStoredProcess/do

正如所讨论的 here,需要注意的事项包括:

1) 使用 cookiefile 以便会话令牌可以写入 (-c) 并随后由 SASLogon 重定向读取 (-b)。

2) _username 和 _password 参数用于身份验证(参见文档)

3) -v 用于详细日志记录,-L 告诉 curl 遵循重定向 (SASLogon) 位置

执行此操作的正确方法(考虑到安全性)是使用他们的票证 API- 您可以使用 PHP 进行 CURL 请求并首先握手最终获得结果STP 端点。

步骤 1a) POST 请求 .../SASLogon/v1/tickets 使用用户名和密码的表单编码负载。

Step1b) 查看响应 header "Location"(用“/”[-1] 分隔)以获取您的身份验证令牌。

Step2a) 向相同的第一个 url 发出 POST 请求,并在末尾附加身份验证令牌 - 并传入 body(形式编码)服务 url (service=xxx)(理想情况下是.../SASStoredProcess/do)端点。

Step2b) 解析响应 body 以获取您的票证令牌。

Step3a) 运行 对服务的请求 (.../do?token=[TicketToken]) 带有 POST _program = STP endpoint

Step3b) 结果将是您请求的结果。

这可能需要一些特定的 SAS 安装配置设置 - 但这是一般的票据握手(通常 - 从记忆中输入,而不是我面前的例子)。 SAS 非常具体,具体取决于版本和您安装的是什么。

您可以使用 CURL 实现此目的,但我个人认为我喜欢使用更高级别的请求库。

给出的其他答案都是有效的 - 但 auth-behind 我假设您想要适当级别的安全性的场景 - 在每个请求中传递用户名和密码存在安全风险。在我看来,使用票务系统和握手将是一种 "better" 形式的解决方案。