我使用CakePHP 2.4。我的网站上有一个OAuth signin。 %99.5的登录成功,但%0.5失败。我好几个月都有这个错误。我尝试了很多东西来调试和记录,但我仍然没有解决问题。虽然大部分要求都很好,但我需要解决一小部分问题。
情景是这样的:
oauth_token
保存在用户的会话中
例如,会话ID为aaa1234
CakePHP创建PHPSESSID cookie并在此cookie中保存会话ID。
我将用户重定向到Twitter服务器并且用户确认我的应用程序
oauth_token
和oauth_verifier
并获取access_tokens
。会话ID为aaa1234
。一切都很好。oauth_token
。当我检查会话ID时,我看到ID已更改,ID现在为bbb2345
对于方案b:
好像用户现在有了新的会话ID。在新会话中找不到oauth_token
。但请注意,旧会话数据存在于/tmp/sessions/
文件夹中。
会话aaa1234
不存在会话ID cookie。但是我在2天前设置的另一个跟踪cookie存在于cookie中。
我检查用户代理。
当用户第一次到来并且用户从雅虎服务器回来时也是如此。
此故障情况发生在Chrome,Firefox,移动浏览器或其他浏览器中,因此我无法控制浏览器类型 我应该检查更多以进行诊断?
我的CakePHP core.php设置:
Configure::write('Session', array( 'defaults' => 'cake' ));
Configure::write('Session.cookie', 'MYPHPSESSID');
Configure::write('Session.timeout', 120);
Configure::write('Security.level', 'medium');
其他设置是默认文件中提到的: https://github.com/cakephp/cakephp/blob/2.5/app/Config/core.php#L182
编辑:使用this answer我检查了Cookie。 20%的错误用户禁用了cookie。我问过个人和用户确认的cookie选项。但似乎其他用户没有禁用cookie。还有一些用户使用Android WebViews访问我的网站。在WebView客户端中,我确信我不会禁用cookie。此外,99%的WebView用户都可以成功使用网站。
答案 0 :(得分:8)
由于方案之间的重定向,您的会话ID可能会丢失。 如果您的用户在 HTTP 上收到了会话ID,然后又回到了 HTTPS (反之亦然),那么他的会话将会丢失/替换为之前的旧会话关于那个计划。
这不是100%肯定,但如果我是你,我会试着看一下(在我过去的项目中也发生过这种情况)。
修改强>
说明:
客户在 HTTP 上获取会话,会将其重定向以用于oauth目的,当他们回来时,他们会通过 HTTPS 来访问。
在 HTTP 和 HTTPS 之间移动时,PHP正常会话($ _SESSION)会丢失。会话本身保留在服务器端,但是客户端丢失了session_id,因此服务器无法识别他并且会话丢失,所以我使用的是纯PHP,100%的客户端会丢失会话背部。
CakePHP 通过保存sesion id的cookie来处理这个常见问题,然后当客户端在请求标头上没有session_id时返回时,会话因cookie而恢复。失败的客户的0.05%是具有以下一个(或多个)的客户:
可能的解决方案:
首先在HTTPS上初始化cookie(即首先检查用户是否在HTTP上,然后将其重定向到HTTPS,然后初始化会话,然后将其重定向到oauth端点) - 我个人推荐它。 / p>
一些oauth提供程序在完成其身份验证时为URL添加参数以重定向用户。您可以使用它并将其会话ID作为参数发送。 - 我不建议这样做,因为那时你可能会将你客户的会话ID暴露给攻击者。
答案 1 :(得分:1)
我认为CBroe在这里有钱。我之前也遇到过这种情况(不是专门针对OAuth,而是使用设置会话cookie的其他重定向)。
答案 2 :(得分:0)
为什么不检查会话ID是否已设置在未设置或我们可以说与服务器不同的情况下?另一种方法是,如果我们将会话变量设置在一个临时变量中,那么当它变为空白时,这将附加到我们的会话变量。
答案 3 :(得分:-4)
在所有控制器的最开头写下这个:
!session_id() ? session_start() : '';
我不知道为什么,但我自己也遇到了同样的问题。我发现在CakePHP中使用OAuth重定向时,会话ID会以某种方式丢失。上面的行确保会话ID始终存在。希望这会有所帮助。