簡體   English   中英

在request.post之后返​​回請求上下文

[英]Return request context after requests.post

我有一個服務器A,它使用python的請求模塊( r = request.post(url=url) )向服務器B發出POST請求。 服務器B修改請求並返回帶有重定向到URL的響應。 我可以通過在服務器A上執行redirect(r.url)來訪問重定向的url,但是我需要將修改后的請求上下文與它一起傳遞。 這可能嗎?

場景:服務器A在python Flask上運行。

r = requests.post(url='https://serverb.com/validateToken', data={'token':'abc'})
redirect(r.url)

服務器B在python Django上運行。

def validateToken(request):
  # On successful validation
  request.session[key] = mapped_token_to_user_id
  redirect('/successfulToken') # On server B

當訪問/successfulToken ,服務器B檢查是否在請求對象上存在會話,但是由於重定向,該請求是裸露的。

Django服務器將設置一個cookie來標識與會話關聯的客戶端:

request.session[key] = mapped_token_to_user_id

請參閱Django會話文檔

會話框架使您可以基於每個站點訪問者存儲和檢索任意數據。 它在服務器端存儲數據,並抽象化cookie的發送和接收。 Cookies包含會話ID [...]

然后,您將連接到服務器A的瀏覽器重定向到服務器B返回的URL,但是您丟棄了cookie信息。 連接到服務器A的客戶端沒有cookie,因此不會將其傳遞給服務器B。

並且, 除非服務器B與服務器A處於同一域中,否則您無法將該Cookie傳遞給客戶端。 瀏覽器不會將從一個域接收的cookie發送到另一個域; 例如,不應與stack.flow.com的 cookie共享google.com ,否則,這將是一個很大的安全問題。

因此,如果服務器A和服務器B位於兩個不同的域(例如,服務器A的foo.bar.example和服務器B的spam.ham.example ),那么在重定向時就沒有路徑將cookie傳遞給客戶端客戶端到服務器B。在這種情況下,您必須讓服務器A 直接連接到新的服務器B URL,並傳遞響應中的cookie。

如果服務器A和服務器B確實共享一個域( foo.bar.examplespam.bar.example共享.bar.example作為域名),則可以為該共享域名設置cookie(在.前綴上名稱)告訴客戶端它可以與同一域名中的所有服務器共享此Cookie。

無論哪種方式,您都需要提取會話cookie。 Django使用默認名稱是sessionid

session_cookie = r.cookies['sessionid']

如果要從服務器A連接到新的URL,則需要將該cookie添加到傳出請求中( requests.get(url, cookies={'sessionid': session_cookie} )。

如果要通過重定向將其提供給客戶端,請在返回之前在響應中進行設置:

response = redirect(r.url)
response.set_cookie('sessionid', session_cookie, domain='.bar.example')
return response

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM