आर

2016-01-16 8 views
12

में प्रेजेंटर के साथ एक शिबबोलेथ बहु-होस्टनाम वेबसाइट को प्रमाणित करने के लिए कैसे करें नोट: आईपम्स अंतरराष्ट्रीय और आईपम्स यूएसए शायद उसी सिस्टम का उपयोग करते हैं। ipums usa त्वरित साइनअप की अनुमति देता है। अगर आप अपने कोड का परीक्षण करना चाहते हैं, तो साइन अप करने के लिए https://usa.ipums.org/usa-action/users/request_access आज़माएं!आर

मैं आर भाषा और प्रेजेंटर के साथ https://international.ipums.org/ से प्रोग्रामेटिक रूप से फ़ाइल डाउनलोड करने का प्रयास कर रहा हूं। मुझे प्रेजेंटर का उपयोग करने की आवश्यकता है और आरसीआरएल नहीं है क्योंकि मुझे पोस्ट-प्रमाणीकरण की आवश्यकता है बड़ी फाइलें रैम में सीधे डिस्क पर डाउनलोड करने की आवश्यकता है। this is currently only possible with httr as far as i know

दस्तावेज नीचे दिए गए पुन: उत्पादित कोड दस्तावेज़ पोस्ट (https://international.ipums.org/international-action/users/login) से मुख्य पोस्ट-प्रमाणीकरण पृष्ठ पर प्राप्त करने के लिए मेरे सर्वोत्तम प्रयासों को दस्तावेज करता है। किसी भी सुझाव या संकेत की सराहना की जाएगी! धन्यवाद!

my_email <- "[email protected]" 
my_password <- "password" 

tf <- tempfile() 

# use httr, because i need to download a large file after authentication 
# and only httr supports that with its `write_disk()` option 
library(httr) 

# turn off ssl verify, otherwise the subsequent GET command will fail 
set_config(config(ssl_verifypeer = 0L)) 

GET("https://international.ipums.org/Shibboleth.sso/Login?target=https%3A%2F%2Finternational.ipums.org%2Finternational-action%2Fmenu") 

# connect to the starting login page of the website 
(a <- GET("https://international.ipums.org/international-action/users/login" , verbose(info = TRUE))) 

# which takes me through to a lot of websites, but ultimately (in my browser) lands at 
shibboleth_url <- "https://live.identity.popdata.org:443/idp/Authn/UserPassword" 

# construct authentication information? 
base_values <- list("j_username" = my_email , "j_password" = my_password) 
idp_values <- list("j_username" = my_email , "j_password" = my_password , "_idp_authn_lc_key"=subset(a$cookies , domain == "live.identity.popdata.org")$value , "JSESSIONID" = subset(a$cookies , domain == "#HttpOnly_live.identity.popdata.org")$value) 
ipums_values <- list("j_username" = my_email , "j_password" = my_password , "_idp_authn_lc_key"=subset(a$cookies , domain == "live.identity.popdata.org")$value , "JSESSIONID" = subset(a$cookies , domain == "international.ipums.org")$value) 

# i believe this is where the main login should happen, but it looks like it's failing 
GET(shibboleth_url , query = idp_values) 
POST(shibboleth_url , body = base_values) 
writeBin(GET(shibboleth_url , query = idp_values)$content , tf) 

readLines(tf) 
# The MPC account authentication system has encountered an error 
# This error can sometimes occur if you did not close your browser after logging out of an application previously. It may also occur for other reasons. Please close your browser and try your action again."                  

writeBin(GET("https://live.identity.popdata.org/idp/profile/SAML2/Redirect/SSO" , query = idp_values)$content , tf) 
POST("https://live.identity.popdata.org/idp/profile/SAML2/Redirect/SSO" , body = idp_values) 
readLines(tf) 
# same error as above 

# return to the main login page.. 
writeBin(GET("https://international.ipums.org/international-action/menu" , query = ipums_values)$content , tf) 
readLines(tf) 
# ..not logged in 
+0

क्या आपने इसके लिए आरसेलेनियम के बारे में सोचा है? – Thomas

+0

@ थॉमस हाय, मुझे नहीं पता कि कहां से शुरू करना है।मैं इसके लिए खुले रहूंगा, जब तक कि यह एक मनमाने ढंग से बड़ी फ़ाइल _post-authentication_ (जो 'प्रेजेंटर' कर सकता है लेकिन 'आरसीआरएलएल नहीं कर सकता) –

+1

वास्तव में वहां कोई खाता नहीं होने के बिना प्रयास करने के लिए बहुत कुछ नहीं है :( – cyberj0g

उत्तर

2

आप सर्वर से अपनी कुकी भेजने के लिए set_cookies() उपयोग करने के लिए:

library(httr) 
library(rvest) 
#my_email <- "xxx" 
#my_password <- "yyy" 
tf <- tempfile() 
set_config(config(ssl_verifypeer = 0L)) 

# Get first page 
p1 <- GET("https://international.ipums.org/international-action/users/login" , verbose(info = TRUE)) 

# Post Login credentials 
b2 <- list("j_username" = my_email , "j_password" = my_password) 
c2 <- c(JSESSIONID=p1$cookies[p1$cookies$domain=="#HttpOnly_live.identity.popdata.org",]$value, 
      `_idp_authn_lc_key`=p1$cookies[p1$cookies$domain=="live.identity.popdata.org",]$value) 
p2 <- POST(p1$url,body = b2, set_cookies(.cookies = c2), encode="form") 

# Parse hidden fields 
h2 <- read_html(p2$content) 
form <- h2 %>% html_form() 

# Post hidden fields 
b3 <- list("RelayState"=form[[1]]$fields[[1]]$value, "SAMLResponse"=form[[1]]$fields[[2]]$value) 
c3 <- c(JSESSIONID=p1$cookies[p1$cookies$domain=="#HttpOnly_live.identity.popdata.org",]$value, 
      `_idp_session`=p2$cookies[p2$cookies$name=="_idp_session",]$value, 
      `_idp_authn_lc_key`=p2$cookies[p2$cookies$name=="_idp_authn_lc_key",]$value) 
p3 <- POST(form[[1]]$url , body=b3, set_cookies(.cookies = c3), encode = "form") 

# Get interesting page 
c4 <- c(JSESSIONID=p3$cookies[p1$cookies$domain=="international.ipums.org" && p3$cookies$name=="JSESSIONID",]$value, 
      `_idp_session`=p3$cookies[p3$cookies$name=="_idp_session",]$value, 
      `_idp_authn_lc_key`=p3$cookies[p3$cookies$name=="_idp_authn_lc_key",]$value) 
p4 <- GET("https://international.ipums.org/international-action/menu", set_cookies(.cookies = c4)) 
writeBin(p4$content , tf) 
readLines(tf)[55] 

परिणाम के बाद से

[1] " <li class=\"lastItem\"><a href=\"/international-action/users/logout\">Logout</a></li>" 

है मैं आप लॉग इन हैं लगता है ...

+0

एकदम सही है। धन्यवाद एक खाता प्राप्त करने के लिए सक्षम होना चाहिए। यहाँ https://github.com/ajdamico/asdfree/commit/79988d577b98b250a17e606630153b8e67698c2e श्रेय –

2

@ हबर्ट एल ने सही दिशा में कई कदम उठाए हैं, हालांकि, मुझे लगता है कि उनका जवाब पूरा नहीं हुआ है।

सबसे पहले, जब आप स्वचालित वेब प्रमाणीकरण को कार्यान्वित कर रहे हों तो यह देखने के लिए मुख्य बात यह है कि कुकीज़ 'सामान्य' मैन्युअल वर्कफ़्लो के दौरान उपयोग की जा रही है। आप आसानी से किसी भी आधुनिक ब्राउज़र में देव उपकरणों के साथ उन पर जासूसी कर सकते हैं: enter image description here

यहाँ, हम JSESSIONID और _shibsession* कुकीज़ देखते हैं, पहले एक रखती वेबसाइट के JSP सत्र आईडी, दूसरा केवल एक समूह का चिह्न प्राधिकरण के लिए सबसे अधिक संभावना है। सर्वर, शायद, उन्हें किसी भी तरह से बंधे हैं, लेकिन JSESSIONID को प्राधिकरण की आवश्यकता नहीं है और आप वेबसाइट खोलने के तुरंत बाद इसे प्राप्त कर सकते हैं। इसलिए, हमें अधिकृत होने के लिए JSESSIONID के लिए _shibsession* कुकी प्राप्त करनी होगी। कई रीडायरेक्ट के साथ शिबबोलेथ की प्राधिकरण प्रक्रिया यही है। कोड में टिप्पणियां देखें।

login_ipums = function(user, password) 
{ 
    require(httr) 
    require(rvest) 

    set_config(config(ssl_verifypeer = 0L)) 

    #important - httr preserves cookies on subsequent requests to the same host, we don't need that because of sessions expiration 
    handle_reset("https://usa.ipums.org/") 

    #set login and password 
    login1 = GET("https://usa.ipums.org/usa-action/users/login") 
    form_auth = list("j_username" = user , "j_password" = password) 

    l1_cookies=login1$cookies$value 
    names(l1_cookies)=login1$cookies$name 

    #receive auth tokens as html hidden fields in a form 
    login2 = POST(login1$url, body = form_auth, set_cookies(.cookies=l1_cookies), encode="form") 
    login2_form = read_html(login2$content) %>% html_form() 

    l2_cookies=login2$cookies$value 
    names(l2_cookies)=login2$cookies$name 

    #submit the form back (browser submits it back automatically with JS) 
    login3 = POST(login2_form[[1]]$url, body=list(RelayState=login2_form[[1]]$fields$RelayState$value, 
               SAMLResponse=login2_form[[1]]$fields$SAMLResponse$value), 
       set_cookies(.cookies=l2_cookies), 
       encode="form") 

    #now we have what we came for - _shibsession_* and JSESSION id cookie 
    login_cookies = login3$cookies$value 
    names(login_cookies)=login3$cookies$name 

    return=login_cookies 
} 

login_ipums करने के लिए कॉल के बाद हम निम्न कुकी होगा: यहाँ

> cookies=login_ipums(my_email, my_password) 
> names(cookies) 
[1] "JSESSIONID"  
[2] "_idp_authn_lc_key"    
[3] "_shibsession_7573612e69..." 

, हम दोनों JSESSIONID और _shibsession_* साइट-व्यापी प्राधिकरण के लिए इस्तेमाल किया है। _idp_authn_lc_key, शायद, आवश्यक नहीं है, लेकिन इसे छोड़कर चोट नहीं पहुंचीगी।

अब, आप आसानी उस तरह फ़ाइलों को डाउनलोड कर सकते हैं:

cookies=login_ipums(my_email, my_password) 
target = GET("https://usa.ipums.org/usa-action/downloads/extract_files/usa_00001.dat.gz", 
     set_cookies(.cookies=cookies), 
     write_disk("file.bin", overwrite = TRUE)) 

महत्वपूर्ण नोट: जैसा कि आप देख सकते हैं, मैं IPUMS संयुक्त राज्य अमेरिका, नहीं अंतर्राष्ट्रीय इस्तेमाल किया। अपने खाते के साथ उस कोड को चेक करने के लिए, usa को international के साथ प्रतिस्थापित करें, जिसमें URL में *-action शामिल हैं।

+0

अद्भुत है, धन्यवाद! @ HubertL के कोड मेरे लिए काम करता है, की तरह दिखता है तुम्हारा भी करता है। धन्यवाद !! –

+0

ठीक है, लेकिन ध्यान दें कि @ हबर्टएल का कोड कभी भी '_shibsession_ *' (वास्तविक प्रमाणीकरण टोकन) कुकी को स्पष्ट रूप से सेट नहीं करता है, यह (संभवत: अनजाने में) 'प्रेजेंटर' कुकी दृढ़ता तंत्र पर निर्भर करता है और यह एक हो सकता है उत्पादन पर मुद्दा। – cyberj0g