我有一个服务器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检查是否在请求对象上存在会话,但是由于重定向,请求是裸露的。
答案 0 :(得分:0)
Django服务器将设置一个cookie,以标识与会话相关联的客户端:
request.session[key] = mapped_token_to_user_id
请参见Django session documentation:
会话框架使您可以基于每个站点访问者存储和检索任意数据。它在服务器端存储数据,并抽象化cookie的发送和接收。 Cookies包含会话ID [...]
然后,将连接到服务器A的浏览器重定向到从服务器B返回的URL,但是您丢弃cookie信息。连接到服务器A的客户端没有cookie,因此不会将其传递给服务器B。
并且除非服务器B与服务器A位于同一域,否则您无法将该Cookie传递给客户端。浏览器不会将从一个域接收的cookie发送到另一个域; stackoverflow.com 的Cookie不应与 google.com 共享,否则,这将是一个很大的安全问题。
因此,如果服务器A和服务器B处于两个不同的域(例如,服务器A的foo.bar.example
和服务器B的spam.ham.example
),则没有路径将Cookie传递给客户端当您将客户端重定向到服务器B时。在这种情况下,您必须直接将服务器A 连接到新的服务器B URL,并传递响应中的cookie。
如果服务器A和服务器B确实共享一个域(foo.bar.example
和spam.bar.example
共享.bar.example
作为域名),则可以为该共享域名设置cookie(使用名称上的.
前缀)告诉客户端它可以与同一域名中的所有服务器共享此cookie。
无论哪种方式,您都需要提取会话cookie。 default name used by Django is 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