由于HTTP 302,无法使用Python检索NTLM认证的网页

如何解决由于HTTP 302,无法使用Python检索NTLM认证的网页

|| 谁能帮我下面提供的python代码?我已对其进行了一些稍微的修改,以供自己使用。我试图从运行NTLM身份验证的Windows服务器访问网页。起初,我的问题是保持持久连接,这样我就不会出现http 401错误。现在,我已经克服了这一点,但是发生的是我收到了HTTP 302重定向错误以及在响应的set-cookie中发送回的cookie。因此,我添加了一个cookie处理程序,但是没有做任何事情。另外,从服务器返回的“位置”字段包含我最初提交的原始URL。我不明白这一点。为什么从服务器发送回进行重定向的位置字段具有与我提交的完全相同的URL?
import urllib2
import httplib,socket 
import cookielib
import ntlm 
from ntlm import ntlm 

class AbstractNtlmAuthHandler: 

   httplib.HTTPConnection.debuglevel = 1 
   url1 = \"\"

   def __init__(self,password_mgr=None): 
      if password_mgr is None: 
         password_mgr = HTTPPasswordMgr() 
      self.passwd = password_mgr 
      self.add_password = self.passwd.add_password 

    def http_error_authentication_required(self,auth_header_field,req,fp,headers): 
      auth_header_value = headers.get(auth_header_field,None) 
      if auth_header_field: 
         if \'ntlm\' in auth_header_value.lower(): 
         if auth_header_value is not None and \'ntlm\' in auth_header_value.lower(): 
            fp.close() 
            return self.retry_using_http_NTLM_auth(req,None,headers) 

   def retry_using_http_NTLM_auth(self,realm,headers): 

      print req.get_full_url()
      print \"\\n\\n\"

      #user,pw = self.passwd.find_user_password(realm,req.get_full_url()) 
      user,url1) 
      if pw is not None: 
     # ntlm secures a socket,so we must use the same socket for the complete handshake 
     headers = dict(req.headers) 
     headers.update(req.unredirected_hdrs) 
     auth = \'NTLM %s\' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(user) 

     if req.headers.get(self.auth_header,None) == auth: 
        return None 
     headers[self.auth_header] = auth 

     host = req.get_host() 
     if not host: 
        raise URLError(\'no host given\') 
     h = None 
     if req.get_full_url().startswith(\'https://\'): 
        h = httplib.HTTPSConnection(host) # will parse host:port 
     else: 
        h = httplib.HTTPConnection(host) # will parse host:port 
         # we must keep the connection because NTLM authenticates the connection,not single requests 
         headers[\"Connection\"] = \"Keep-Alive\" 
         headers = dict((name.title(),val) for name,val in headers.items()) 
         h.request(req.get_method(),req.get_selector(),req.data,headers) 
         r = h.getresponse() 
         r.begin() 
         r._safe_read(int(r.getheader(\'content-length\'))) 
         if r.getheader(\'set-cookie\'): 
            # this is important for some web applications that store authentication-related info in cookies (it took a long time to figure out) 
            headers[\'Cookie\'] = r.getheader(\'set-cookie\') 
         r.fp = None # remove the reference to the socket,so that it can not be closed by the response object (we want to keep the socket open) 
         auth_header_value = r.getheader(auth_header_field,None) 
         (ServerChallenge,NegotiateFlags) = ntlm.parse_NTLM_CHALLENGE_MESSAGE   (auth_header_value[5:]) 
         user_parts = user.split(\'\\\\\',1) 
         DomainName = user_parts[0].upper() 
         UserName = user_parts[1] 
         auth = \'NTLM %s\' % ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge,UserName,DomainName,pw,NegotiateFlags) 
         headers[self.auth_header] = auth 
         headers[\"Connection\"] = \"Close\" 
         headers = dict((name.title(),val in headers.items()) 
         try: 
            h.request(req.get_method(),headers) 
            # none of the configured handlers are triggered,for example redirect-responses are not handled! 
            return h.getresponse() 
         except socket.error,err: 
            raise URLError(err) 
      else: 
         return None 


class HTTPNtlmAuthHandler(AbstractNtlmAuthHandler,urllib2.BaseHandler): 

   auth_header = \'Authorization\' 

   def http_error_401(self,code,msg,headers): 
      return self.http_error_authentication_required(\'www-authenticate\',headers) 


class ProxyNtlmAuthHandler(AbstractNtlmAuthHandler,urllib2.BaseHandler): 
   auth_header = \'Proxy-authorization\' 
   def http_error_407(self,headers): 
      return self.http_error_authentication_required(\'proxy-authenticate\',headers) 


if __name__ == \"__main__\": 
   url = \'HTTP WEB ADDRESS HERE\'
   url1 = url

   user = \'USERNAME\'
   password = \'PASSWORD\' 
   user_agent = \'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)\'
   data = \"\"
   headers = { \'User-Agent\' : user_agent }


   passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
   passman.add_password(None,url,user,password) 


   cookie_jar = cookielib.CookieJar()
   cookie_handler = urllib2.HTTPCookieProcessor(cookie_jar)

   redirect = urllib2.HTTPRedirectHandler()
   auth_basic = urllib2.HTTPBasicAuthHandler(passman) 
   auth_digest = urllib2.HTTPDigestAuthHandler(passman) 
   auth_NTLM = HTTPNtlmAuthHandler(passman) 

   opener = urllib2.build_opener(cookie_handler,auth_NTLM,auth_basic,auth_digest,redirect)
   urllib2.install_opener(opener) 

   req = urllib2.Request(url,data,headers)
   response = urllib2.urlopen(req)
    

解决方法

        从服务器获得响应后,请检查其是否为302状态。如果状态为302,请获取cookie并使用cookie信息进行另一个请求
if(response.code==302):
        header={\'Cookie\':response.headers[\'Set-Cookie\']}
        req=urllib2.Request(thesameurl,None,header)
        response=urllib2.urlopen(req)
response.read()
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-