【发布时间】:2022-01-31 15:20:48
【问题描述】:
我正在创建一个与用 Go 编写的后端对话的 React 应用程序。我已经使用 Gorilla 库设置了 CSRF。 React 代码将首先向csrfToken 端点发送一个 GET 请求,并在该端点接收令牌。发送 POST 请求时在标头中设置此令牌。
func main() {
r := mux.NewRouter()
r.HandleFunc("/signup/post", SubmitSignupForm).Methods(http.MethodPost, http.MethodOptions)
r.HandleFunc("/csrfToken", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(csrf.Token(r)))
})
r.Use(csrf.Protect(
[]byte("fff"),
csrf.Path("/"),
csrf.Secure(false),
csrf.TrustedOrigins([]string{"http://localhost:3001/"}),
csrf.RequestHeader("TOKEN"),
))
c := cors.AllowAll()
http.ListenAndServe(":8000", c.Handler(r))
}
React 代码如下所示:
import React from 'react';
import './App.css';
import useAxios from "axios-hooks";
function App() {
const [{response: csrfToken}] = useAxios<string>({url: "http://localhost:8000/csrfToken"})
const [{response}, doRequest] = useAxios<string>({
url: "http://localhost:8000/signup/post",
method: "POST"
}, {manual: true})
return (
<div className="App">
<header className="App-header">
<h1>hello</h1>
<h1>csrf: {csrfToken?.data}</h1>
<h1>Response: {response?.data}</h1>
<button onClick={e => {
doRequest({data: {key: "something"}, headers: {"TOKEN": csrfToken!.data}})
}}>click
</button>
</header>
</div>
);
}
export default App;
让我最困惑的是,我能够通过 Postman 向 /csrfTokenendpoint 发送请求,并将该值与标头一起使用。
但是,当我在浏览器中执行相同操作时,我得到一个 403 并回复 Forbidden - CSRF token invalid。
任何想法我做错了什么?
【问题讨论】: