Authentication 与受密码保护的Jupyter/api交互

Authentication 与受密码保护的Jupyter/api交互,authentication,urllib2,jupyter,jupyter-notebook,Authentication,Urllib2,Jupyter,Jupyter Notebook,一位朋友正在尝试运行一个测试来检查哪些笔记本使用了最多的内存,但是他们的服务器有密码保护。我正试图弄清楚如何使用urllib2配置身份验证,因为我不相信有用户名,只有密码。在深入研究笔记本代码并通过一些尝试和错误后,我找到了如何实现这一点(我转而使用请求) 我不能保证这是最好的方法,但它确实对我有效。实际上,我在代码中的其他地方设置了变量,但为了完整起见,这里包含了变量 导入请求 主机名='127.0.0.1' 端口='8888' 密码='mypassword' base_url='http:/

一位朋友正在尝试运行一个测试来检查哪些笔记本使用了最多的内存,但是他们的服务器有密码保护。我正试图弄清楚如何使用
urllib2
配置身份验证,因为我不相信有用户名,只有密码。

在深入研究笔记本代码并通过一些尝试和错误后,我找到了如何实现这一点(我转而使用
请求

我不能保证这是最好的方法,但它确实对我有效。实际上,我在代码中的其他地方设置了变量,但为了完整起见,这里包含了变量

导入请求
主机名='127.0.0.1'
端口='8888'
密码='mypassword'
base_url='http://{0}:{1}/'。格式(主机名、端口)
h={}
如果输入密码:
r=requests.post(基本url+‘login’,参数={
“密码”:密码
})
h=r.request.headers
sessions=requests.get(base_url+'api/sessions',headers=h).json()

我相信这是有效的,因为当您点击
/login
端点时,它会使用正确的标题集重定向您。我猜
请求
保留了重定向的头,这样我们就可以在另一个调用中重用这些头了。只提取cookies并使用cookies可能更好,但这一点目前仍然有效:)

在深入研究笔记本代码并通过一些尝试和错误后,我找到了如何做到这一点(我转而使用
请求

我不能保证这是最好的方法,但它确实对我有效。实际上,我在代码中的其他地方设置了变量,但为了完整起见,这里包含了变量

导入请求
主机名='127.0.0.1'
端口='8888'
密码='mypassword'
base_url='http://{0}:{1}/'。格式(主机名、端口)
h={}
如果输入密码:
r=requests.post(基本url+‘login’,参数={
“密码”:密码
})
h=r.request.headers
sessions=requests.get(base_url+'api/sessions',headers=h).json()

我相信这是有效的,因为当您点击
/login
端点时,它会使用正确的标题集重定向您。我猜
请求
保留了重定向的头,这样我们就可以在另一个调用中重用这些头了。只提取cookies并使用它们可能会更好,但这目前是有效的:)

因为jupyter现在在cookie中使用了“xsrf”,所以@aiguofer的答案对我不起作用。以下几点对我很有帮助:

s = requests.Session()
url='http://127.0.0.1:8888/login/'
resp=s.get(url)
xsrf_cookie = resp.cookies['_xsrf']

params={'_xsrf':xsrf_cookie,'password': password}
s.post(url, data=params)

在那之后,
s
可以用来调用API。

这个@aiguofer答案对我来说不起作用,因为jupyter现在在cookie中使用了“xsrf”。以下几点对我很有帮助:

s = requests.Session()
url='http://127.0.0.1:8888/login/'
resp=s.get(url)
xsrf_cookie = resp.cookies['_xsrf']

params={'_xsrf':xsrf_cookie,'password': password}
s.post(url, data=params)

之后,可以使用
s
调用API。

新版本似乎有一些变化。url“/login”对我不起作用,我需要添加
next
参数

url='http://localhost:8050/login?next=%2F'

用于登录请求。其余的就跟

新版本似乎有一些变化。url“/login”对我不起作用,我需要添加
next
参数

url='http://localhost:8050/login?next=%2F'

用于登录请求。其余的就像我在使用jupyter put api upload file response 403时发现的一样

需要添加“X-XSRFToken”头才能解决此问题

data= json.dumps({
            "name": "test.jpg",
            "path": "path",
            "type":"file",
            "format": "base64",
            "content": "base64 data"
        })

headers["X-XSRFToken"] = xsrf_cookie
s.put(url, data=data, headers=headers)

我发现当使用jupyter放置api上传文件响应403时

需要添加“X-XSRFToken”头才能解决此问题

data= json.dumps({
            "name": "test.jpg",
            "path": "path",
            "type":"file",
            "format": "base64",
            "content": "base64 data"
        })

headers["X-XSRFToken"] = xsrf_cookie
s.put(url, data=data, headers=headers)

谢谢你指出这一点。我已经在我的代码中修复了这个问题,但是忘记了这个,所以发布/回答。谢谢你指出这一点。我已经在代码中修复了这个问题,但是忘记了这个帖子/答案。