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

时间:2015-12-03 21:06:50

标签: delphi neo4j indy

我正在尝试连接到Neo4J沙箱,并且可以在在线浏览器中正常连接。但是,我现在正试图通过一个小应用程序连接。第一步是进行身份验证,无论我尝试什么,我都会得到'401 / Unauthorized'。据我所知,我正在遵循"Authorization tokens" documentation中的步骤。

使用普通的HTTP连接,我正在发布:

  • /authentication
  • 内容类型:application/json
  • 接受:application/json; charset=UTF-8
  • Accept-Charset:UTF-8

有效内容是一个JSON字符串:{ "username" : "neo4j", "password" : "MYPASSWORD" }

这与我在网络浏览器中登录沙箱时使用的用户名和密码相同。我也尝试将连接请求用户名和密码设置为相同的值。请注意,没有身份验证请求响应。

流量的完整日志是:

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的Indy库进行通信。设置非常简单:连接按钮,要登录的备忘录,表单上的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;

据我所知,这应该遵循"Authenticate to obtain an authentication token" documentation。但显然不是。我做错了什么?

理想情况下,拥有完整的POST身份验证步骤会很不错。身份验证是其他问题的常见问题,没有解决方案对我有帮助。所有连接步骤和响应的确定答案对于那些追问这个问题的人来说都会有很大的帮助。

编辑:这是Neo4J 2.3.1。这是今天早些时候通过Neo4J Getting Started -> Sandbox页面制作的沙盒。

1 个答案:

答案 0 :(得分:1)

您引用的文档适用于neo4j 2.2.0-M02版。使用neo4j版本2.2.0-M04更改了REST API身份验证机制。

2.3.1的文档是here。引用:

  

使用HTTP向Neo4j发送用户名和密码进行身份验证   基本认证请求应包含一个Authorization标头,带有   值Basic <payload>,其中“payload”是base64编码的字符串   “用户名:密码”。

     

示例请求

GET http://localhost:7474/user/neo4j
Accept: application/json; charset=UTF-8
Authorization: Basic bmVvNGo6c2VjcmV0