Delphi 对Neo4J服务器进行后期身份验证的正确步骤是什么?
我正在尝试连接到Neo4J沙盒,并且可以在在线浏览器中很好地连接。不过,我现在正试图通过一个小应用程序进行连接。第一步是进行身份验证,无论我尝试什么,都会得到“401/Unauthorized”。据我所知,我正在遵循中的步骤 通过普通HTTP连接,我正在发布:Delphi 对Neo4J服务器进行后期身份验证的正确步骤是什么?,delphi,neo4j,indy,Delphi,Neo4j,Indy,我正在尝试连接到Neo4J沙盒,并且可以在在线浏览器中很好地连接。不过,我现在正试图通过一个小应用程序进行连接。第一步是进行身份验证,无论我尝试什么,都会得到“401/Unauthorized”。据我所知,我正在遵循中的步骤 通过普通HTTP连接,我正在发布: 到/authentication 内容类型:application/json 接受:application/json;字符集=UTF-8 接受字符集:UTF-8 有效负载是一个JSON字符串:{“username”:“neo4j”,“
- 到
/authentication
- 内容类型:
application/json
- 接受:
application/json;字符集=UTF-8
- 接受字符集:
UTF-8
{“username”:“neo4j”,“password”:“MYPASSWORD”}
这与我在web浏览器中登录沙箱时使用的用户名和密码相同。我还尝试将连接请求用户名和密码设置为相同的值。注意,没有身份验证请求响应
流量的完整日志为:
Send:
POST /authentication HTTP/1.0
Connection: keep-alive
Content-Type: application/json
Content-Length: 91
Host: ec2-52-23-247-121.compute-1.amazonaws.com:32780
Accept: application/json; charset=UTF-8
Accept-Charset: UTF-8
Accept-Encoding: identity
User-Agent: Mozilla/3.0 (compatible; Indy Library)
Send:
%7B+%22username%22+%3A+%22neo4j%22%2C+%22password%22+%3A+%22MYPASSWORD%22+%7D
Receive:
HTTP/1.1 401 Unauthorized
Date: Thu, 03 Dec 2015 20:50:11 GMT
Content-Type: application/json; charset=UTF-8
WWW-Authenticate: None
Content-Length: 139
Connection: keep-alive
Server: Jetty(9.2.4.v20141103)
{
"errors" : [ {
"code" : "Neo.ClientError.Security.AuthorizationFailed",
"message" : "No authorization header supplied."
} ]
}
注意:我已经在上面的日志中修改了我的实际密码
发送的数据是否应该按原样进行编码?(“%7B+%22username%22+…
”?)这是我正在使用的HTTP库的自动行为,我对HTTP通信不太熟悉,不知道它是否正确
因此,“未提供授权头”似乎是一个很好的提示,但是文档没有要求提供授权头,而是说发送JSON格式的用户名和密码作为有效负载。另外,当我设置请求用户名和密码时,我从来没有看到通信量会这样通信
我正在使用Delphi的印地图书馆进行交流。设置非常简单:一个用于连接的按钮,一个用于登录的备忘录,表单上的TIdHTTP
组件,以及一个用于拦截流量的TIdLogStream
组件(这就是上面日志的来源)。除了IdHTTP1.intercept
设置为IdLogStream1
之外,所有设置都是默认设置
连接方法为:
procedure TForm1.btnConnectClick(Sender: TObject);
var
ParamList: TStringList;
Res : string;
begin
ParamList := TStringList.Create;
try
try
IdHTTP1.Request.Accept := 'application/json; charset=UTF-8';
IdHTTP1.Request.AcceptCharSet := 'UTF-8';
IdHTTP1.Request.ContentType := 'application/json';
ParamList.Add('{ "username" : "neo4j", "password" : "MYPASSWORD" }');
IdHTTP1.Request.Username := 'neo4j';
IdHTTP1.Request.Password := 'MYPASSWORD';
Res := IdHTTP1.Post('http://ec2-52-23-247-121.compute-1.amazonaws.com:32780/authentication', ParamList);
memData.Lines.Add(Res);
except
on E : Exception do
memData.Lines.Add('Exception: ' + E.ToString);
end;
finally
ParamList.Free;
end;
end;
据我所知,这应该遵循规则。但显然不是。我做错了什么
理想情况下,最好有一套完整的后身份验证步骤。在这里,身份验证是其他问题中的一个常见问题,这些问题的解决方案对我没有帮助。对所有连接步骤和响应的明确回答也将对后面的人有很大帮助
编辑:这是Neo4J 2.3.1。这是今天早些时候通过页面制作的沙盒。您引用的文档是针对neo4j版本2.2.0-M02的。REST API身份验证机制随neo4j版本2.2.0-M04而改变 2.3.1的文件如下所示。引述: 通过使用HTTP向Neo4j发送用户名和密码进行身份验证 基本授权。请求应包括授权标头,并带有
Basic
的值,其中“payload”是base64编码的字符串
用户名:密码
示例请求
GET http://localhost:7474/user/neo4j
Accept: application/json; charset=UTF-8
Authorization: Basic bmVvNGo6c2VjcmV0
你使用的是什么版本的neo4j?@cybersam看起来像2.3.1。我已经更新了这个问题,很抱歉之前没有包含这个问题。好的,请参阅下面我的答案。请注意,您不能使用
TIdHTTP.Post()的TStrings
版本发布JSON数据。该版本的Post()
仅用于发布HTML Web表单数据,而您没有这样做。您必须使用TStream
版本的Post()
。将您的JSON
字符串放入UTF-8编码的TStringStream
,或使用Indy的WriteStringToStream()
函数将JSON字符串UTF-8编码为TMemoryStream
@RemyLebeau非常有用的信息,谢谢!那看起来很有用,谢谢。遗憾的是他们网站上的文档链接把我带到了过时的网站:/这里已经很晚了-我明天或周末会尝试更新。嗨,大卫!哪个页面有过期文档的链接?我们会尽快修好的。谢谢仅供参考,TIdHTTP
内置了对Basic
身份验证的支持。只需将TIdHTTP.Request.BasicAuthentication
属性设置为true,然后根据需要设置TIdHTTP.Request.Username
和TIdHTTP.Request.Password
属性。