如何发布authenticity_token?

时间:2016-08-21 07:50:17

标签: ruby-on-rails

现在我使用arduino以json格式向rails发送数据。 但是如何获得authenticity_token并将其发送到rails? 它应该写在哪里?在json或http标头? 格式应该是什么?

如果我添加

protect_from_forgery :exception => :create

在控制器中它工作正常。但我不想禁用CSRF保护。 这是我的arduino代码:

    client.println("POST /players.json HTTP/1.1");
    client.println("Host: 192.168.1.3:3000");
    client.println("User-Agent: Arduino/1.0");
    client.println("csrf-param: authenticity_token");
    client.println("csrf-token: V4gTh8yNdz9VMybUXkI6tHxzAHdfk3I+UoiXhxZWK0bkoh8iG5hVJ5sZOjzMAYLlwCwsXQQM102b1hF6TVyYJw==");
    client.println("Connection: close");
    client.println(lengthInfo);
    client.println("Content-Type: application/json");
    client.println();
    root.printTo(client);

root.printTo(客户端)只发送儿子。

我发现了一个类似的问题:

HTTP request to update rails model from arduino

@Okomikeruko 你是否弄清楚如何从Arduino发送真实性令牌?

1 个答案:

答案 0 :(得分:1)

真实性令牌是基于会话的身份验证策略的安全检查。它基本上做的是检查填充webform的用户是否是登录的用户(并避免XSS攻击)。

但是,在我看来,这种身份验证策略不是公共API的最佳选择。在你的情况下,我会做以下之一:

  • 基于会话的身份验证。第一个API请求应该是对用户控制器的POST请求。如果此请求成功,则响应应返回会话cookie,您可以使用该cookie来验证以下请求(直到会话结束)。

  • 基于令牌的身份验证。你可以创建一个独特的随机n-char字符串(可能是80个字符?),这将是每个用户的秘密api密钥。之后,每个API请求都应该包含此密钥作为参数,以便说出控制器"它是我"。

请注意,您在API查询中使用的控制器与您在网络导航中使用的控制器不同。在我的项目中,我通常有一个文件夹" app / controllers / v1"存储我的API的第一个版本中使用的控制器