OAuth重定向后会话丢失

时间:2014-02-27 20:21:15

标签: php session cakephp cookies session-cookies

我使用CakePHP 2.4。我的网站上有一个OAuth signin。 %99.5的登录成功,但%0.5失败。我好几个月都有这个错误。我尝试了很多东西来调试和记录,但我仍然没有解决问题。虽然大部分要求都很好,但我需要解决一小部分问题。

情景是这样的:

  • 用户点击登录按钮
  • 我从服务器获取请求令牌(例如yahoo,twitter)
  • 我将oauth_token保存在用户的会话中 例如,会话ID为aaa1234
  • CakePHP创建PHPSESSID cookie并在此cookie中保存会话ID。

  • 我将用户重定向到Twitter服务器并且用户确认我的应用程序

  • 用户使用oauth验证者来到我的网站 a)我使用用户的oauth_tokenoauth_verifier并获取access_tokens。会话ID为aaa1234。一切都很好。
    b)失败。因为我在当前会话中找不到用户的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用户都可以成功使用网站。

4 个答案:

答案 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%是具有以下一个(或多个)的客户:

  1. 禁用Cookie(更常见)
  2. 在HTTP / HTTPS之间切换时不会保留来自同一网站的Cookie的浏览器(更为罕见)
  3. 可能的解决方案:

    1. 首先在HTTPS上初始化cookie(即首先检查用户是否在HTTP上,然后将其重定向到HTTPS,然后初始化会话,然后将其重定向到oauth端点) - 我个人推荐它。 / p>

    2. 一些oauth提供程序在完成其身份验证时为URL添加参数以重定向用户。您可以使用它并将其会话ID作为参数发送。 - 我不建议这样做,因为那时你可能会将你客户的会话ID暴露给攻击者。

    3. 祝你好运!

答案 1 :(得分:1)

我认为CBroe在这里有钱。我之前也遇到过这种情况(不是专门针对OAuth,而是使用设置会话cookie的其他重定向)。

更多信息: Losing session variables after redirect

答案 2 :(得分:0)

为什么不检查会话ID是否已设置在未设置或我们可以说与服务器不同的情况下?另一种方法是,如果我们将会话变量设置在一个临时变量中,那么当它变为空白时,这将附加到我们的会话变量。

答案 3 :(得分:-4)

在所有控制器的最开头写下这个:

!session_id() ? session_start() : '';

我不知道为什么,但我自己也遇到了同样的问题。我发现在CakePHP中使用OAuth重定向时,会话ID会以某种方式丢失。上面的行确保会话ID始终存在。希望这会有所帮助。