我遇到了以下问题。前端网站(www.domain.com)用于填写属于后端网站(backend.domain.com)的表单。该表单受验证码保护,验证码的参考值保存在用户会话中(在PHP中)。
提交应该是基于Ajax的,这给跨域带来了一些问题。因此,我在www.domain.com上编写了一个小PHP代理。该代理请求后端表单。当用户提交表单时,向代理发出Ajax请求,代理向后端发送验证请求并返回结果。
所有这些都工作得很好,除了在用户会话中保存引用的验证码。由于前端网站将表单提交给后端,后端将为前端使用会话。
解决这个问题的最好方法是什么?我想出了两种方法。第一种方法是在表单中包含验证码的引用(散列),这样就不需要会话了。另一种方法是使用iframe从后端直接包含表单。第二种方法可能会工作得很好,但感觉真的很难看。在这种情况下你有什么建议?
更新:描述情况的序列图:
Client www.domain.com backend.domain.com
| | |
|-------visit site---------->| |
| |-----get form----->|
| |<----return form---|
|<------return form----------| |
| | |
|-------submit form--------->| |
| |-----submit form-->|
| |<----send reply----|
|<------captcha failed-------| |
v v v
感觉像是cookie(或会话号)问题。为会话设置的cookie对www站点有效,但对后端站点无效。但是由于所有的通信都是通过您的前端进行的,您可以不使用前端站点来进行授权吗?
Client www.domain.com backend.domain.com
| | |
|-------visit site---------->| |
| |--get login form-->|
| |<----return form---|
| |set cookie |
|<-return login form+cookie--| |
| | |
|----submit login form------>| |
| |-----submit form-->|
| | |check cookie
| |<----send reply----|
|<------captcha failed-------| |
v v v
www站点必须设置cookie,因为它正在与客户端通信,但后端检查它-由于cookie设置为不同的域,后端无法访问它。解决方案:www应该读取cookie并将cookie数据转发到后端进行处理