所以,基本上我所做的是我在 Flask 中设置了一个可以接收 GET 和 POST 请求的路由。 React 在组件挂载时发送 GET 请求,Flask 以 csrf 令牌作为标头进行响应(手动完成)。然后 React 将这个值存储在 state 中。提交表单时,来自 state 的 csrf 令牌作为字段发送,类似于在纯 Flask 应用程序中发送的方式,它将是一个隐藏字段。虽然这在技术上有效,但我很好奇这是否仍然容易受到 CSRF 的影响。我认为下一个最佳选择是在所有端点上设置 CSRF 保护,所以如果这不安全,可以尝试一下。
烧瓶路线:
@app.route('/api/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
print(request.method)
if request.method == 'GET':
return ('', {'csrf_token': form.csrf_token._value()})
elif form.validate_on_submit():
return { 'message': 'Login successful' }, 200
else:
return { 'errors': form.errors }
componentDidMount 中的 GET 请求:
componentDidMount() {
axios.get('/api/login',{data: null, headers: {'Content-Type': 'application/json'}})
.then(res => {
console.log(res)
this.setState({
csrf: res.headers.csrf_token
});
})
}
提交表单时的POST请求:
onSubmitLogin = e => {
e.preventDefault();
const userData = {
username: this.state.username,
password: this.state.password,
csrf_token: this.state.csrf
};
axios({
method: 'post',
url: '/api/login',
data: userData,
headers: {
'content-type': 'application/json'
}
})
.then(res => {
console.log(res);
});
}