【问题标题】:Invoke SAS Stored Process in a web service link through python suds通过 python suds 在 Web 服务链接中调用 SAS 存储过程
【发布时间】:2016-03-02 02:48:54
【问题描述】:

我已将 sas 存储过程部署为 Web 服务。我想在 python 中查看存储过程的输出。 如果有人可以帮助我,我将不胜感激。

这是我用过的流程——

创建的网络服务是 - 'https://sasdev.wdw.disney.com:443/SASBIWS/services/abcweb.wsdl'

我认为,它将存储过程存储在一个函数中,这里是 abc_web()

我在这里使用的python代码是-

import urllib
import logging
from suds.client import Client
#from suds.wsse import *

import requests

import suds_requests


url = 'https://sasdev.wdw.disney.com:443/SASBIWS/services/abcweb.wsdl'
namespace = 'https://sasdev.wdw.disney.com:443/SASBIWS/services'

client = Client(url)
client.service.abc_web()

但它收到一个错误:


    ERROR:suds.client:<?xml version="1.0" encoding="UTF-8"?>
        <SOAP-ENV:Envelope xmlns:ns0="http://tempuri.org/abcweb"      xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
       <SOAP-ENV:Header/>
       <ns1:Body>
          <ns0:abc_web/>
       </ns1:Body>
      </SOAP-ENV:Envelope>

WebFault:服务器引发错误:“客户端身份验证”类型 执行“abcweb”服务期间发生异常。这 异常如下:没有可用的安全上下文。'

【问题讨论】:

  • 您的 URL 不是外部的。看起来它设置为仅供内部访问。你如何在 python 中将用户凭据传递给你的 WS?例如,您是否能够从 SoapUI 连接到您的 WS?
  • 当我尝试使用 SOAPUI 对其进行测试时,我收到错误消息 - 在执行“abcweb”服务期间发生了“客户端身份验证”类型的异常。例外如下:没有可用的安全上下文。故障代码:1000
  • 嘿@Jinsi,如果有的话,您目前如何将凭据传递给 WS?
  • security = Security() token = UsernameToken('username', 'password') security.tokens.append(token) client.set_options(wsse=security) client.set_options(retxml=True) 结果= client.service.abc_web() 这就是我 pssing 凭据的方式,这是正确的方式吗?
  • 从 SOAP XML 的角度来看,它看起来是正确的,但我不是 python 专家。事实是,您没有正确验证自己。请参阅下面的答案以获取更详细的说明。

标签: python web-services soap wsdl sas


【解决方案1】:

错误代码 1000 表示:Specifies an invalid user name or password (the client application might want to re-prompt the user for credentials). 来源:http://support.sas.com/documentation/cdl/en/wbsvcdg/61496/HTML/default/viewer.htm#a003275627.htm

首先,看看您是否可以在 SoapUI 中使用正确的身份验证设置此 WS。 见下图。在 SoapUI 中,单击您的 SOAP 请求,然后转到下面的属性,您需要在其中输入您的域\用户 ID 和密码。 SAS 支持加密,但假设它启用了基本身份验证,您可以将其保留为纯文本。

您应该能够在 SoapUI 中运行您的 SOAP 请求。

实际上,它将在标准 SOAP 信封中添加一个 HEAD 标记,其中包含以下这些行。您可以在 SOAP UI 中打开 SOAP Log 时看到:

<soapenv:Header><wsse:Security soapenv:mustUnderstand="1"
xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
xmlns:wsu=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd>
<wsse:UsernameToken wsu:Id="">
<wsse:Username>domain\username</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Password</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"></wsse:Nonce>
<wsu:Created>2014-10-22T15:10:21.866Z</wsu:Created></wsse:UsernameToken></wsse:Security></soapenv:Header>

在这里告诉我你的进展情况。很抱歉,我可以直接帮助您使用 Python,但如果您让它在 SoapUI 中工作,您可以比较 SoapIU 和您的 Python 客户端之间的 SOAP 请求,看看 Python 做错了什么。

附:如果您不喜欢在 SoapUI 中输入纯文本密码,可以先使用 PROC PWENCODE 对密码进行加密,然后将其复制粘贴到 SoapUI 中。

【讨论】:

  • 不要打扰 PWENCODE... 编码的值可用于获取访问权限,因此它只是给人一种虚假的安全感。
  • 编码值可以访问 SAS,这是真的。但是,如果 SAS 平台使用 AD 身份验证,那么非编码值将允许访问工作站、服务器、邮件和任何其他也使用 AD 的东西。所以它仍然将安全风险降到最低,当然不会消除它。
  • 公平点。我只是对 SAS 仍然没有提供一种将纯文本密码排除在代码之外的安全方法感到沮丧。
【解决方案2】:

我使用以下脚本通过身份验证成功连接到 SAS Web 服务:

用户名和密码需要自定义。

from cred import username, password
from suds.client import Client
from suds.wsse import *


security = Security()
token = UsernameToken(username, password)
security.tokens.append(token)


url = 'http://srv/SASBIWS/services/folder/add?WSDL'


client = Client(url = url)
client.set_options(wsse=security)

print client

params = client.factory.create('addParameters')

params.num1 = 32452352
params.num2 = 34



print params
print client.service.add(params)

希望这有助于解决对 SASWebServices 的身份验证问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 2010-11-26
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    相关资源
    最近更新 更多