首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在microsoft身份验证后使用python请求获取json

在microsoft身份验证后使用python请求获取json
EN

Stack Overflow用户
提问于 2021-08-06 06:04:58
回答 1查看 123关注 0票数 1

我正在尝试从使用microsoft身份验证的uses服务访问一些json数据

我有一个可以在浏览器中登录的用户名和密码。

如果我将登录数据作为auth传递,则响应是一堵由难以辨认的html和js脚本组成的墙

代码语言:javascript
复制
s = requests.Session()
login_data =  {'login':username, 'loginfmt':username, 'passwd':pw}
r=s.post(login_url,auth=login_data)
r= s.get(json_url)
print(r.text)

我尝试从浏览器登录时复制网络数据、cookie和头文件,但使用这种方法也只能得到难以辨认的html和js。

代码语言:javascript
复制
cookies = {
    'x-ms-gateway-slice': 'estsfd',
    'stsservicecookie': 'estsfd',
    'AADSSO': 'NA|NoExtension',
    'buid': '...',
    'fpc': '...',
    'esctx': '...',
    'brcap': '0',
    'clrc': '...',
    'wlidperf': '...',
}

headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
    'sec-ch-ua-mobile': '?0',
    'Upgrade-Insecure-Requests': '1',
    'Origin': 'https://login.microsoftonline.com',
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Dest': 'document',
    'Referer': 'https://login.microsoftonline.com/.../oauth2/authorize?client_id=...&redirect_uri=...&response_type=id_token&scope=...&x-client-ver=6.8.0.0&sso_reload=true',
    'Accept-Language': 'en-US,en;q=0.9',
}

data = {
  'i13': '0',
  'login': '',
  'loginfmt': '',
  'type': '11',
  'LoginOptions': '3',
  'lrt': '',
  'lrtPartition': '',
  'hisRegion': '',
  'hisScaleUnit': '',
  'passwd': '',
  'ps': '2',
  'psRNGCDefaultType': '',
  'psRNGCEntropy': '',
  'psRNGCSLK': '',
  'canary': '...',
  'ctx': '...',
  'hpgrequestid': '...',
  'flowToken': '...',
  'PPSX': '',
  'NewUser': '1',
  'FoundMSAs': '',
  'fspost': '0',
  'i21': '0',
  'CookieDisclosure': '0',
  'IsFidoSupported': '1',
  'isSignupPost': '0',
  'i2': '1',
  'i17': '',
  'i18': '',
  'i19': '...'
}
s = requests.Session()
r=s.post(login_url, headers=headers, cookies=cookies, data=data)
r= s.get(json_url)
print(r.text)

这些数据,即canary、ctx、hprequestid和flow标记,会在不同的post中更改

唯一有效的方法是在身份验证之后从获取cookie

代码语言:javascript
复制
cookies = {
    'ARRAffinity': '...',
    'ARRAffinitySameSite': '...',
    '.AspNetCore.AzureADCookie': 'chunks-2',
    '.AspNetCore.AzureADCookieC1': '...',
    '.AspNetCore.AzureADCookieC2': '...',
}
s = requests.Session()
r= s.get(json_url,cookies=cookies)
print(r.text)

但是cookie会在一段时间后过期,而且每次都手动将cookie复制到脚本中并不是超级可持续的。

我试着阅读了Kerberos和msal模块,但我找不到任何关于从使用microsoft身份验证的set服务检索数据的内容,只找到如何为您自己的set服务设置ms auth。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-12 05:49:13

使用请求,你需要html在某处提供的一堆数据,我应该在每个请求的ctx和hprquestid更改中发现这一点。这个问题和答案非常相似:Login to Facebook using python requests

我最终所做的是使用selenium登录并获取json。

代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import datetime, json

browser = webdriver.Firefox()
browser.get(json_url)
elem = browser.find_element_by_name('loginfmt')
elem.send_keys(username + Keys.RETURN)

time.sleep(1)
elem = browser.find_element_by_name('passwd')
elem.send_keys(pw + Keys.RETURN)

time.sleep(1)
browser.get(json_url)

elem = browser.find_element_by_id('json')
json_data_rettid = json.loads(elem.get_attribute('innerHTML'))

browser.quit()

(我知道我应该使用在selenium中构建等待函数,但我在编写这段代码时并没有这样做)

注意:我发现很难让chrome驱动程序工作,所以我建议使用firefox驱动程序

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68676857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档