Alfresco 基本身份验证适用于 curl 但不适用于 python

Alfresco basic authentication works with curl but not with python

我遇到了来自 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, files=files, 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')})```