0

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

Web 应用程序是用 PHP 构建的,我将使用 CURL 来发出请求。

这可能吗?哪些 CURL 选项是必需的?

4

3 回答 3

4

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

Step1a) POST 请求 .../SASLogon/v1/tickets 带有用户名和密码的表单编码有效负载。

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

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

Step2b) 为您的票证解析响应正文。

Step3a) Run a request to the service (the .../do?token=[TicketToken]) with a POST payload (form encoded) of _program = STP endpoint

Step3b) Results will be the result of your request.

This probably requires some specific SAS installation config things setup- but is the general ticket handshake (generally- typing from memory, not with example in front of me). SAS is very specific depending on the version and what the install you have is.

You can achieve this with CURL, but in my personal opinion I like using higher level request libraries.

The other answers given are both valid- but auth-behind the scenes I assume you want a proper level of security- passing the username and password in each request is a security risk. Using the ticket system and handshake would be a "better" form solution in my mind.

于 2018-11-07T10:26:59.163 回答
3

首先,按照此处的说明,确保您的存储过程 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 代码使用了工作所需的最少选项。它假定在​​某些时候您可能还想解析标题数据以确定结果的 CONTENT-TYPE。

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

于 2018-08-16T22:11:03.580 回答
2

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

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

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

1) 使用 cookie 文件,以便可以通过 SASLogon 重定向写入 (-c) 并随后读取 (-b) 会话令牌。

2) _username 和 _password 参数用于进行身份验证(请参阅文档)

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

于 2018-08-16T22:32:44.527 回答