通过pythonsuds调用web服务链接中的SAS存储进程

通过pythonsuds调用web服务链接中的SAS存储进程,python,web-services,soap,wsdl,sas,Python,Web Services,Soap,Wsdl,Sas,我已将sas存储进程部署为web服务。我想看看python中存储进程的输出。 如果有人能帮我,我会非常感激 以下是我使用的流程- 创建的Web服务是- '' 我认为,它将存储的进程存储在一个函数中,这里是abc_web() 我在这里使用的python代码是- import urllib import logging from suds.client import Client #from suds.wsse import * import requests import suds_reque

我已将sas存储进程部署为web服务。我想看看python中存储进程的输出。 如果有人能帮我,我会非常感激

以下是我使用的流程-

创建的Web服务是- ''

我认为,它将存储的进程存储在一个函数中,这里是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>

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


错误代码1000表示:
指定了无效的用户名或密码(客户端应用程序可能希望重新提示用户输入凭据)。
来源:

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

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

实际上,它将在标准的SOAP信封中添加一个标题标签,下面有这些行。在SOAP UI中打开SOAP日志时可以看到:

<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>

域\用户名
密码
2014-10-22T15:10:21.866Z
让我知道你进展如何。很抱歉,我可以帮助您使用Python direct,但是如果您让它在SoapUI中工作,那么您可以比较SoapIU和您的Python客户机之间的SOAP请求,以了解Python的错误

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


我使用下面的脚本成功地通过auth连接到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的身份验证问题。

您的URL不是外部URL。看起来它只是为内部访问设置的。如何在python中将用户凭据传递给WS?例如,您是否能够从SoapUI连接到WS?当我尝试使用SoapUI测试它时,收到的错误为-'在执行'abcweb'服务期间发生的'Client Authentication'类型的异常。例外情况如下:没有可用的安全上下文。“错误代码:1000Hey@Jinsi,您当前如何向WS-If传递凭据?security=security()token=UsernameToken('username','password')security.tokens.append(token)client.set_options(wsse=security)client.set_options(retxml=True)result=client.service.abc_web()这就是我如何使用凭据的方法,这是一种正确的方法吗?从SOAP XML的角度看,这是正确的,但我不是python专家。事实是,您没有正确地验证自己。请参阅下面我的答案以获得更详细的解释。不要为PWENCODE而烦恼。。。编码值可用于获取访问权限,因此它只会提供错误的安全感。编码值提供对SAS的访问权限,这是真的。但是,如果SAS平台使用AD身份验证,那么非编码值将允许访问工作站、服务器、邮件和其他也使用AD的内容。因此,它仍然将安全风险降至最低,当然不会消除它。公平点。我只是感到沮丧的是,SAS仍然没有提供一种安全的方法来防止明文密码进入代码。