2012-02-17 10 views
0

しばらくの間、NTLMを使用してjythonがサイトにアクセスする方法を見つけようとしています。私はpythonの基本知識とjavaのnoneの隣にあるので、私が見つけたこのスクリプト部分でNTLMを使う方法をいくつかの助け(または例)することができます。私はオープンソースのアプリケーショングラインダーでこれを使用しています。NTLMセキュリティを使用してサイトにアクセスするためにjythonでjcifsを使用する

まず私はグラインダーで使用される他の人と一緒にスクリプトにJCIFSをインポートで開始:

from net.grinder.script import Test 
from net.grinder.script.Grinder import grinder 
from net.grinder.plugin.http import HTTPPluginControl, HTTPRequest 
from HTTPClient import NVPair 

from jcifs.ntlmssp import Type1Message 
from jcifs.ntlmssp import Type2Message, Type3Message 
from jcifs.util import Base64 

このコード部分は、実施例に提供された、私は発見しました。それは私が見つけることができたクローズ事でした、それは私の要求に合うでしょう、私はただ要求に完全な応答を得る必要があるので。 request101はURLとヘッダで事前に定義されています

result = request101.GET('/') 

def NTLMAuthentication1(url, request, info, NTLMfield): 
    token_type1 = info.token_type1() 

    params = (NVPair("Authorization", "NTLM "+token_type1),) 
    result = request.GET(url, None, params) 
    NTLMfield = result.getHeader("WWW-Authenticate") 
    return NTLMAuthentication2(url, request, info, NTLMfield) 

def NTLMAuthentication2(url, request, info, NTLMfield): 
    if NTLMfield.startswith("Negotiate"): 
     token_type2 = NTLMfield[len("Negotiate "):] 
    else: 
     token_type2 = NTLMfield[5:] 

    token_type3 = info.token_type3(token_type2) 
    params = (NVPair("Cookie", "WSS_KeepSessionAuthenticated=80"), 
       NVPair("Authorization", "NTLM " + token_type3),) 
    result = request.GET(url, None, params) 
    return result 

# this function validate request and its result to see if the NTLM authentication is required 
def NTLMAuthentication(lastResult, request, info): 
    # get last http request's url 
    url = lastResult.getEffectiveURI().toString()[len(request.getUrl()):] 

    # The result is ask for authentication 
    if lastResult.statusCode != 401 and lastResult.statusCode != 407: 
     return lastResult 

    NTLMfield = lastResult.getHeader("WWW-Authenticate") 
    if NTLMfield == None: 
     return lastResult 

    # check it is the first shakehands 
    if NTLMfield == "Negotiate, NTLM" or NTLMfield == "NTLM": 
     return NTLMAuthentication1(url, request, info, NTLMfield) 

    # check it is the second shakehands 
    elif len(NTLMfield) > 4 and NTLMfield[:4] == "NTLM": 
     return NTLMAuthentication2(url, request, info, NTLMfield) 

    else: 
     return lastResult 

class NTLMAuthenticationInfo: 
    def __init__(self, domain, host, user, passwd): 
     self.domain = 'domain' 
     self.host = 'host' 
     self.user = 'user' 
     self.passwd = 'password' 

    def token_type1(self): 
     msg = Type1Message(Type1Message.getDefaultFlags(), self.domain, self.host) 
     return Base64.encode(msg.toByteArray()) 

    def token_type3(self, token_type2): 
     msg2 = Type2Message(Base64.decode(token_type2)) 

#if jcifs 1.3.7 using msg3 = Type3Message(msg2, self.passwd, self.domain, self.user, self.host) 
     msg3 = Type3Message(msg2, self.passwd, self.domain, self.user, self.host) 
     return Base64.encode(msg3.toByteArray()) 

主要部分では、要求は次のようになります。だから、基本的に、私は

を実装する方法の手掛かりを持っていない私は、この

result = request101.GET('/') 
print str(NTLMAuthentication(result, request101, NTLMAuthenticationInfo)) 

だけでなく、ちょうどこの

NTLMAuthentication(request101.GET('/'), request101, NTLMAuthenticationInfo) 

を試してみましたが、これらのどちらも働きました。これを実行する方法に関するヒント?

答えて

1

この

ai = NTLMAuthenticationInfo("domain", "your host", "user", "password") 
result = request101.GET('/') 
result = NTLMAuthentication(result, request101, ai) 
を試してみてください
関連する問題