问题描述
我遇到了来自 Alfresco 的身份验证错误问题,也许有人可以在我尝试从 Alfresco 的混乱中查找日志文件时启发我。
curl -uadmin:password -X POST https://hostname/alfresco/api/-default-/public/alfresco/versions/1/nodes/node_uuid/children -F filedata=@/home/user/file.pdf
现在,当我尝试使用 python requests(TM) 时,它给了我 401。我检查了请求,它们都发送了相同的身份验证哈希
这是python代码:
def handle_row_for_request(row):
url = 'https://' + hostname + '/alfresco/api/-default-/public/alfresco/versions/1/nodes/' + base_uuid + '/children'
data = '/home/user/file.pdf'
with open(data,'rb') as payload:
headers={"content-type": "multipart/form-data"}
response = requests.post(url,headers=headers,data=payload,auth=(username,password))
解决方法
您正在使用 data
参数,但您需要使用 file
argument:
def handle_row_for_request(row):
url = 'https://' + hostname + '/alfresco/api/-default-/public/alfresco/versions/1/nodes/' + base_uuid + '/children'
files = {'filedata': ('/home/user/file.pdf',open('/home/user/file.pdf','rb'))}
headers={"content-type": "multipart/form-data"}
response = requests.post(url,headers=headers,files=files,auth=(username,password))
,
下面是 Python 代码,它适用于上传,也使用基本身份验证。请检查请求参数。
import json
import requests
url = "http://localhost:8080/alfresco/service/api/upload"
auth = ("admin","admin")
files = {"filedata": open("/tmp/foo.txt","rb")}
data = {"siteid": "test","containerid": "documentLibrary"}
r = requests.post(url,data=data,auth=auth)
print(r.status_code)
print(json.loads(r.text))
,
问题有两部分。首先我需要使用文件参数而不是数据。最重要的是,Alfresto 想要在文件参数中获取 'filedata' 字符串。
其次 auth(user,pw) 生成了一个哈希,最后有一个 = 符号,在 alfresco 上说 401。当我使用 cURL 并从那里获取密码哈希时,它最后有两个 = 符号。很奇怪吧?但这奏效了。我没有使用 auth(user,pw),而是将 'Authorization': 'Basic ${base64thing}' 设置为身份验证。
response = requests.post(url,headers={'Authorization': 'Basic base64string'},files={'filedata': open(/path/,'rb')})```