Delphi 对Neo4J服务器进行后期身份验证的正确步骤是什么?

Delphi 对Neo4J服务器进行后期身份验证的正确步骤是什么?,delphi,neo4j,indy,Delphi,Neo4j,Indy,我正在尝试连接到Neo4J沙盒,并且可以在在线浏览器中很好地连接。不过,我现在正试图通过一个小应用程序进行连接。第一步是进行身份验证,无论我尝试什么,都会得到“401/Unauthorized”。据我所知,我正在遵循中的步骤 通过普通HTTP连接,我正在发布: 到/authentication 内容类型:application/json 接受:application/json;字符集=UTF-8 接受字符集:UTF-8 有效负载是一个JSON字符串:{“username”:“neo4j”,“

我正在尝试连接到Neo4J沙盒,并且可以在在线浏览器中很好地连接。不过,我现在正试图通过一个小应用程序进行连接。第一步是进行身份验证,无论我尝试什么,都会得到“401/Unauthorized”。据我所知,我正在遵循中的步骤

通过普通HTTP连接,我正在发布:

  • /authentication
  • 内容类型:
    application/json
  • 接受:
    application/json;字符集=UTF-8
  • 接受字符集:
    UTF-8
有效负载是一个JSON字符串:
{“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
属性。