-
Notifications
You must be signed in to change notification settings - Fork 0
/
hms_saml_login.py
105 lines (92 loc) · 2.87 KB
/
hms_saml_login.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import requests,base64
from urlparse import urlparse,parse_qs
from HTMLParser import HTMLParser
username = "cbmi_test1@medlab.harvard.edu"
password = "%$^xxxxx"
adfsurl = "http://adfs.medlab.harvard.edu/adfs/services/trust"
callback = "http://localhost:8000/callback/"
connectionstring = "hms-it-test"
auth0client = "oI1eRm6NxzYD4fcikngYYKDnxjLLY7wb"
auth0initial = "https://hms-dbmi.auth0.com/authorize?response_type=code&scope=openid%20profile&client_id="+auth0client+"&redirect_uri="+callback+"&connection=%s" % connectionstring
auth0callback = "https://hms-dbmi.auth0.com/login/callback?connection=%s" % connectionstring
class MyHTMLParser(HTMLParser):
def __init__(self, fh):
"""
{fh} must be an input stream returned by open() or urllib2.urlopen()
"""
HTMLParser.__init__(self)
self.fileids = []
self.fields={}
self.feed(fh)
def handle_starttag(self, tag, attrs):
if tag == 'input':
attrD = dict(attrs)
self.fileids.append(attrD)
value=None
try:
value = attrD['value']
except:
pass
try:
self.fields[attrD['name']]=value
except Exception as e:
pass
def get_fileids(self):
return self.fileids
r = requests.get(auth0initial,allow_redirects=False,verify=False)
adfs = r.headers['location']
auth0cookies = r.cookies
o=urlparse(adfs)
qs = parse_qs(o.query)
cookies = dict(MSISIPSelectionPersistent=base64.b64encode(adfsurl))
headers={
"Connection":"keep-alive",
"Content-Type":"application/x-www-form-urlencoded",
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
}
headers2={
"Connection":"keep-alive",
"Content-Type":"application/x-www-form-urlencoded",
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0",
"Accept":"application/xml"
}
r3 = requests.get(
o.scheme+"://"+o.netloc+o.path,
params={"SAMLRequest":qs['SAMLRequest'][0]},
headers=headers,
cookies=cookies
)
myparser = MyHTMLParser(r3.text)
payload = {
"ctl00$ContentPlaceHolder1$SubmitButton":"Sign+In",
"ctl00$ContentPlaceHolder1$UsernameTextBox":username,
"ctl00$ContentPlaceHolder1$PasswordTextBox":password,
"__VIEWSTATE":myparser.fields["__VIEWSTATE"],
"__VIEWSTATEGENERATOR":myparser.fields["__VIEWSTATEGENERATOR"],
"__EVENTVALIDATION":myparser.fields["__EVENTVALIDATION"],
"__db":myparser.fields["__db"]
}
r4 = requests.post(
o.scheme+"://"+o.netloc+o.path,
params={"SAMLRequest":qs['SAMLRequest'][0]},
headers=headers2,
data=payload,
cookies=cookies
)
myparser = MyHTMLParser(r4.text)
r5 = requests.post(
auth0callback,
headers=headers2,
cookies=auth0cookies,
data={"SAMLResponse":myparser.fields['SAMLResponse']},
verify=False
)
r6 = requests.get(
r5.headers['location'],
headers=headers2,
cookies=r5.cookies,
allow_redirects=False
)
print(r6.cookies['Authorization'])
#print r5.json()