【问题标题】:Phoenix CSRF token not matchingPhoenix CSRF 令牌不匹配
【发布时间】:2018-04-10 12:09:56
【问题描述】:

试图让 ajax 在 Phoenix 上运行。我通过执行以下操作获得了 csrf 令牌,所以我拥有它:

<input type="hidden" id="_csrf_token"  name="_csrf_token" value="<%= get_csrf_token() %>">

然后像这样使用它:

$.ajax({
  type: "POST",
  url: "<%= lesson_path @conn, :create %>",
  beforeSend: function(xhr)
  {
    token = $('#_csrf_token').val();
    xhr.setRequestHeader('_csrf_token', token );
  },
  data: data,
  success: function(data, textStatus, jqXHR) {
    alert(textStatus);
  }
});

问题是我得到的令牌不是正确的令牌。查看 google chrome 检查器,我在请求中收到 403,表示存在无效的 csrf 令牌。有效的会话令牌总是不同于它给我的令牌。得到这样的东西IiJndz5FeV9MMhIKMzggUTtmHUALAAAAkJ/6Yr/k4BxdiKmiaMUqsw== 它通常想要这样的东西hHAg7V4xpjnZsM8Z+H1xw==

知道为什么我会得到与其想要的不同的令牌吗?

我也尝试了以下方法:

Plug.Conn.get_session(conn, :csrf_token)
Map.get(conn.req_cookies, "_csrf_token")

两者都不会返回任何内容。

【问题讨论】:

    标签: elixir csrf phoenix-framework


    【解决方案1】:

    令牌可以由请求通过带有键“_csrf_token”的参数或名称为“x-csrf-token”的标头发送。

    尝试使用键设置标题:

    x-csrf-token
    

    【讨论】:

    • 很高兴有帮助。
    【解决方案2】:

    谢谢。花了我几个小时。我最终得到:

    <div class="form-group">
      <form id="number" name="number" method="post">
        <meta name="csrf" content="<%= Plug.CSRFProtection.get_csrf_token() %>">
        <input id="_csrf_token" name="_csrf_token"
           type="hidden" value="<%= Plug.CSRFProtection.get_csrf_token() %>">
        <%= text_input :blocks, :num, value: "" %>
        <%= submit "Submit", id: "submit", class: "btn btn-primary" %>
      </form>
    </div>
    
    <script>
      var csrf = document.querySelector("meta[name=csrf]").content;
    
      $.ajax({
        url: "/posts",
        type: "post",
        data: {
          post: { title: post } })
        },
        headers: {
            "X-CSRF-TOKEN": csrf
        },
        dataType: "json",
        success: function (data) {
          console.log(data);
        }
      });
    </script>
    

    我不知道是X-CRSF-TOKEN头还是_csrf_token参数是必要的,还是两者都有,所以我会尝试通过反复试验来找出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2020-07-08
      • 2016-12-10
      • 2016-09-20
      • 2017-09-01
      • 2020-01-20
      • 2020-06-17
      相关资源
      最近更新 更多