【问题标题】:How to obtain CSRF token from Laravel and pass it in a python script如何从 Laravel 获取 CSRF 令牌并将其传递给 python 脚本
【发布时间】:2017-02-12 10:02:37
【问题描述】:
我正在使用oauth2-server-laravel 来验证将数据导出到 csv 文件的 api。文档有这个要求。
为了使一些授权和资源服务器工作
正确使用 Laravel5,删除
App\Http\Middleware\VerifyCsrfToken 来自 $middleware 数组的行
并将其放在$routeMiddleware 数组中,如下所示:
'csrf' => App\Http\Middleware\VerifyCsrfToken::class,
注意:记得在任何路由上手动添加 csrf 中间件
很合适。
问题是我的应用程序很大,我不想手动更改所有其他路由。所以我在文档中遇到了X-CSRF-TOKEN。
我的问题是:如何获取 csrf 令牌,以便可以将其附加到 Python 中的标头参数中?文档说我可以使用 HTML 标记 meta,但我没有使用任何 HTML 文件来完成这项任务。
我也不能使用会话,因为我不需要登录来访问 API。
【问题讨论】:
-
即使经过广泛的谷歌搜索,我也找不到解决方案。相反,我将使用 oauth2 的路由添加到 VerifyCsrfToken 的 $except 数组中,如 here 所述
标签:
php
python
laravel
csrf
【解决方案1】:
更好的解决方案:你可以像 BeautifulSoup 一样使用 web scraper 轻松获取令牌
import requests
from bs4 import BeautifulSoup
r = requests.get(url) #url is create form
soup = BeautifulSoup(r.text, 'html.parser')
for link in soup.find_all('input'):
token = link['value']
当然,请注意 Laravel 还会为每个表单生成一个 cookie。因此,您需要将 cookie 与您的发布请求一起发送。
jar = requests.cookies.RequestsCookieJar()
jar.set('XSRF-TOKEN', r.cookies['XSRF-TOKEN'])
现在您可以轻松地发送您的发帖请求。例如,我正在发送登录请求
url_post = "http://localhost/login"
data = {
"_token": token,
"email": "example@email.com",
"password": "password"
}
login_request = requests.post(url_post, data=data, cookies=jar)
print(r.text)