如何从Laravel获取CSRF令牌并将其传递给Python脚本

3
我正在使用 oauth2-server-laravel 进行身份验证,以便将数据导出到 CSV 文件的 API。文档有以下要求。

为了使授权和资源服务器与 Laravel5 正确配合工作,请从 $middleware 数组中删除 App\Http\Middleware\VerifyCsrfToken 行并将其放置在 $routeMiddleware 数组中,如下所示:'csrf' => App\Http\Middleware\VerifyCsrfToken::class,

注意:请记得在适当的路由上手动添加 csrf 中间件。

问题是我的应用程序很大,我不想手动更改所有其他路由。所以我在文档中找到了 X-CSRF-TOKEN
我的问题是:如何在Python中获取csrf令牌,以便将其附加到我的头参数中?文档中说我可以使用HTML标签,但我不需要使用任何HTML文件来完成此任务。 此外,我不能使用会话,因为我不需要登录即可访问API。

即使进行了广泛的谷歌搜索,我仍然找不到解决方案。相反,我按照这里所述,将使用oauth2的路由添加到VerifyCsrfToken$except数组中。 - Phillis Peters
2个回答

3
更好的解决方案:您可以使用像BeautifulSoup这样的Web爬虫轻松地获取令牌。
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。因此,在发送 POST 请求时,您需要一起发送这些 cookie。
jar = requests.cookies.RequestsCookieJar()
    jar.set('XSRF-TOKEN', r.cookies['XSRF-TOKEN'])

现在您可以轻松发送POST请求。例如,我正在发送一个登录请求。

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)

0
除了 @Ali Sharifineyestani 的回答之外,您还应该添加 laravel_session cookie。
jar.set('laravel_session', r.cookies['laravel_session'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接