我有一个服务器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会检查请求对象上是否存在会话,但由于重定向,请求是裸的。
request.session[key] = mapped_token_to_user_id
请参阅Django会话文档:
会话框架允许您在每个站点访问者的基础上存储和检索任意数据。它在服务器端存储数据,并提取cookie的发送和接收。Cookie包含会话ID〔…〕
然后将连接到服务器A的浏览器重定向到从服务器B返回的URL,但会丢弃cookie信息。连接到服务器A的客户端没有cookie,因此不会将其传递给服务器B。
并且除非服务器B与服务器A在同一域上,否则您无法将cookie传递给客户端。浏览器不会将从一个域接收到的cookie发送到另一个域;stackoverflow.com/em>的cookie不应该与google.com共享,如果他们这样做,那将是一个非常大的安全问题。
因此,如果服务器A和服务器B位于两个不同的域上(例如,服务器A的foo.bar.example
和服务器B的spam.ham.example
(,则在将客户端重定向到服务器B时,您没有将cookie传递给客户端的路径。在这种情况下,您必须让服务器A直接连接到新的服务器B URL,并从响应中传递cookie。
如果服务器A和服务器B确实共享一个域(foo.bar.example
和spam.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