Alfresco 基本身份验证适用于 curl 但不适用于 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,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')})```