使用 python 请求与护照 js 服务器进行身份验证
Authentication using python requests with passport js server
我试图制作 CLI 工具来访问我的 API。此 API 使用 Express.Js 创建并使用 Passport.js 进行身份验证,工具将在 Python 中制作。我想问一下如何使用 csrf 令牌和所有内容验证从 python 的请求库发送的请求。我已经尝试过简单的身份验证并查看了许多 Whosebug 答案,但在这种特定情况下没有任何帮助。这是登录表单的样子。
<form action="/login/password" method="post">
<section>
<label for="username">Username</label>
<input id="username" name="username" type="text" autocomplete="username" required autofocus>
</section>
<section>
<label for="current-password">Password</label>
<input id="current-password" name="password" type="password" autocomplete="current-password" required>
</section>
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
<button type="submit">Sign in</button>
而上面代码中提到的`/login/password`路由就是这样处理的。
router.post('/login/password', passport.authenticate('local', {
successReturnToOrRedirect: '/',
failureRedirect: '/login',
failureMessage: true
}));
我们将不胜感激。
所以,当我尝试解决问题而不是在 google 上寻找解决方案时,我想通了。我使用 BeautifulSoup 从 /login
获取 csrf 令牌,然后使用 POST 请求将其发送到 /login/password
。这是代码
def login(session, LOGIN_URL_GET, LOGIN_URL_POST, username, password):
page = session.get(LOGIN_URL_GET)
soup = BeautifulSoup(page.text, "html.parser")
csrf = soup.find('input', {'name': '_csrf'}).get('value')
login_data = dict(username=username, password=password, _csrf=csrf, next='/')
session.post(LOGIN_URL_POST, data=login_data, headers=dict(Referer=LOGIN_URL_GET))
然后我使用 ExpressJS 为会话提供的 connect.sid
东西。
with requests.Session() as reqs:
login(reqs, LOGIN_URL_GET, LOGIN_URL_POST, username, password)
connection_sid = reqs.cookies["connect.sid"]
reqs.close()
do_whatever(connection_sid)
编辑:不能 100% 确定 connect.sid
,我应该这样做吗?
我试图制作 CLI 工具来访问我的 API。此 API 使用 Express.Js 创建并使用 Passport.js 进行身份验证,工具将在 Python 中制作。我想问一下如何使用 csrf 令牌和所有内容验证从 python 的请求库发送的请求。我已经尝试过简单的身份验证并查看了许多 Whosebug 答案,但在这种特定情况下没有任何帮助。这是登录表单的样子。
<form action="/login/password" method="post">
<section>
<label for="username">Username</label>
<input id="username" name="username" type="text" autocomplete="username" required autofocus>
</section>
<section>
<label for="current-password">Password</label>
<input id="current-password" name="password" type="password" autocomplete="current-password" required>
</section>
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
<button type="submit">Sign in</button>
而上面代码中提到的`/login/password`路由就是这样处理的。
router.post('/login/password', passport.authenticate('local', {
successReturnToOrRedirect: '/',
failureRedirect: '/login',
failureMessage: true
}));
我们将不胜感激。
所以,当我尝试解决问题而不是在 google 上寻找解决方案时,我想通了。我使用 BeautifulSoup 从 /login
获取 csrf 令牌,然后使用 POST 请求将其发送到 /login/password
。这是代码
def login(session, LOGIN_URL_GET, LOGIN_URL_POST, username, password):
page = session.get(LOGIN_URL_GET)
soup = BeautifulSoup(page.text, "html.parser")
csrf = soup.find('input', {'name': '_csrf'}).get('value')
login_data = dict(username=username, password=password, _csrf=csrf, next='/')
session.post(LOGIN_URL_POST, data=login_data, headers=dict(Referer=LOGIN_URL_GET))
然后我使用 ExpressJS 为会话提供的 connect.sid
东西。
with requests.Session() as reqs:
login(reqs, LOGIN_URL_GET, LOGIN_URL_POST, username, password)
connection_sid = reqs.cookies["connect.sid"]
reqs.close()
do_whatever(connection_sid)
编辑:不能 100% 确定 connect.sid
,我应该这样做吗?