Dav*_*aza 20 python login saml shibboleth saml-2.0
我正在尝试通过python登录我大学的服务器,但我完全不确定如何生成适当的HTTP POST,创建密钥和证书,以及我可能不熟悉的其他部分需要符合SAML规范.我可以用我的浏览器登录就好了,但我希望能够使用python登录和访问服务器内的其他内容.
作为参考,这是该网站
我已经尝试使用mechanize登录(选择表单,填充字段,通过mechanize.Broswer.submit()点击提交按钮控件等)无济于事; 登录站点每次都会回来.
在这一点上,我愿意用最适合该任务的语言实现解决方案.基本上,我想以编程方式登录SAML经过身份验证的服务器.
Gia*_*uca 27
基本上您必须了解的是SAML身份验证过程背后的工作流程.不幸的是,没有PDF那里似乎确实提供了一个很好的帮助,以找出浏览器访问受SAML保护的网站时所做的事情.
也许你应该看看这样的东西:http://www.docstoc.com/docs/33849977/Workflow-to-Use-Shibboleth-Authentication-to- 签名 ,显然对此:http://en.wikipedia .org/wiki/Security_Assertion_Markup_Language.特别要注意这个方案:

我所做的,当我试图了解工作的SAML方式,因为文件是这么穷,被写下来(是写-在纸张上)中的所有浏览器是从第一个到最后一个做的步骤.我用歌剧,以设置它不允许自动重定向(300,301,302响应代码,等等),并且还没有启用JavaScript.然后我写下了服务器发给我的所有cookie,做了什么,以及出于什么原因.
也许这是太多的努力,但通过这种方式,我能够用Java编写一个适合这项工作的库,并且非常快速和高效.也许总有一天我会把它公之于众......
您应该了解的是,在SAML登录中,有两个参与者在玩:IDP(身份提供者)和SP(服务提供者).
我非常确定您从另一个页面点击"访问受保护的网站"之类的内容到达了您在问题中引用的链接.如果您更加注意,您会注意到您所遵循的链接不是显示身份验证表单的链接.这是因为点击从IDP到SP的链接是SAML的一个步骤.第一步,实际上.它允许IDP定义您是谁,以及您尝试访问其资源的原因.因此,基本上您需要做的是向您所关注的链接发出请求以访问Web表单,并获取它将设置的cookie.您将看不到的是SAMLRequest字符串,编码到您将在链接后面找到的302重定向,发送到进行连接的IDP.
我认为这就是为什么你不能机械化整个过程的原因.您只需连接到表单,没有完成身份识别!
这个很容易.请小心!那些饼干现在设定是不一样上面的饼干.您现在正在连接到一个完全不同的网站.这就是使用SAML的原因:不同的网站,相同的凭据.因此,您可能希望将成功登录提供的这些身份验证cookie存储到其他变量中.IDP现在将发回一个响应(在SAMLRequest之后):SAMLResponse.您必须检测到它获取登录结束的网页的源代码.实际上,这个页面是一个包含响应的大表单,在页面加载时,JS中的一些代码会自动对其进行子选.你必须得到页面的源代码,解析它摆脱所有HTML无用的东西,并获得SAMLResponse(加密).
现在您已准备好结束该过程.您必须向SP发送(通过POST,因为您正在模拟表单)上一步中获得的SAMLResponse.通过这种方式,它将提供访问您要访问的受保护资料所需的cookie.
Aaaaand,你做完了!
同样,我认为你要做的最宝贵的事情就是使用Opera并分析SAML所做的所有重定向.然后,在您的代码中复制它们.这并不困难,请记住,IDP与SP完全不同.
使用无头PhantomJS webkit的Selenium将是您登录Shibboleth的最佳选择,因为它可以为您处理cookie甚至是Javascript.
$ pip install selenium
$ brew install phantomjs
Run Code Online (Sandbox Code Playgroud)
from selenium import webdriver
from selenium.webdriver.support.ui import Select # for <SELECT> HTML form
driver = webdriver.PhantomJS()
# On Windows, use: webdriver.PhantomJS('C:\phantomjs-1.9.7-windows\phantomjs.exe')
# Service selection
# Here I had to select my school among others
driver.get("http://ent.unr-runn.fr/uPortal/")
select = Select(driver.find_element_by_name('user_idp'))
select.select_by_visible_text('ENSICAEN')
driver.find_element_by_id('IdPList').submit()
# Login page (https://cas.ensicaen.fr/cas/login?service=https%3A%2F%2Fshibboleth.ensicaen.fr%2Fidp%2FAuthn%2FRemoteUser)
# Fill the login form and submit it
driver.find_element_by_id('username').send_keys("myusername")
driver.find_element_by_id('password').send_keys("mypassword")
driver.find_element_by_id('fm1').submit()
# Now connected to the home page
# Click on 3 links in order to reach the page I want to scrape
driver.find_element_by_id('tabLink_u1240l1s214').click()
driver.find_element_by_id('formMenu:linknotes1').click()
driver.find_element_by_id('_id137Pluto_108_u1240l1n228_50520_:tabledip:0:_id158Pluto_108_u1240l1n228_50520_').click()
# Select and print an interesting element by its ID
page = driver.find_element_by_id('_id111Pluto_108_u1240l1n228_50520_:tableel:tbody_element')
print page.text
Run Code Online (Sandbox Code Playgroud)
driver = webdriver.Firefox()扩展上面 Stéphane Bruckert 的回答,一旦你使用 Selenium 来获取 auth cookie,你仍然可以切换到请求,如果你想:
import requests
cook = {i['name']: i['value'] for i in driver.get_cookies()}
driver.quit()
r = requests.get("https://protected.ac.uk", cookies=cook)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18828 次 |
| 最近记录: |