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)
を試してみましたが、これらのどちらも働きました。これを実行する方法に関するヒント?