<p>问题是Go1.2不会自动为其HTTP请求使用cookiejar。第一个请求是从登录页面获取CSRF令牌。第二个请求是使用CSRF令牌发布登录。但是,由于在第二个请求上没有将会话cookie附加到HTTP头上,服务器不知道它是试图登录的同一个程序。因此,服务器认为这是CSRF尝试(您从其他地方选择CSRF令牌并尝试重用它)。在</p>
<p>所以要获取登录页面并提取CSRF令牌,我们首先创建自己的客户机对象。否则我们就没地方装饼干罐了。<code>http.PostForm</code>确实允许访问cookie jar:</p>
<pre><code>client = &http.Client{}
</code></pre>
<p>创建一个在<a href="https://stackoverflow.com/questions/11361431/authenticated-http-client-requests-from-golang">authenticated http client requests from golang</a>中描述的cookie Jar。这比官方的:<a href="http://golang.org/pkg/net/http/cookiejar/" rel="nofollow noreferrer">http://golang.org/pkg/net/http/cookiejar/</a>cookiejar更容易安装和调试</p>
^{pr2}$
<p>然后,为了登录,我们重用客户端对象并附加cookie jar:</p>
<pre><code>values := make(url.Values)
values.Set("signin[username]", "myusername")
values.Set("signin[password]", "mypassword")
values.Set("signin[_csrf_token]", csrfToken)
resp, err := client.PostForm("https://spwebservicebm.reaktor.no/admin/login", values)
</code></pre>
<p>您会注意到,除了我们使用<code>client.PostForm</code>而不是<code>http.PostForm</code>,代码几乎与问题中的代码相同。在</p>
<p>感谢dommage和response to <a href="https://stackoverflow.com/questions/11361431/authenticated-http-client-requests-from-golang">authenticated http client requests from golang</a>让我走上正轨。在</p>