cakephp OAuth重定向后会话丢失

sshcrbum  于 2022-11-11  发布在  PHP
关注(0)|答案(5)|浏览(194)

我用的是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内核. 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
编辑:通过使用这个答案,我检查了cookie。20%的错误用户禁用了cookie。我亲自询问,用户确认了cookie选项。但似乎其他用户没有禁用cookie。也有一些用户通过使用Android WebViews访问我的网站。在WebView客户端,我敢肯定我没有禁用cookie。也有99%的WebView用户可以成功使用网站。

vc9ivgsu

vc9ivgsu1#

由于方案之间的重定向,您的会话ID可能会丢失。如果您的用户在HTTP上接收到会话ID,然后在HTTPS上返回(反之亦然),则其会话将丢失/由以前在该方案上的旧会话替换。
这不是100%肯定的,但如果我是你,我会尝试给予它看一看(它也发生在我过去的项目)。

编辑

说明:
客户端在HTTP上获得会话,它们被重定向以用于Oauth目的,当它们返回时,它们通过HTTPS返回。
PHP普通会话($_SESSION)在HTTPHTTPS之间移动时会丢失。会话本身保留在服务器端,但客户端丢失了session_id,因此服务器无法识别他,会话也会丢失,所以如果你使用的是纯PHP,100%的客户端会在返回时丢失会话。

CakePHP通过保存会话id的cookie来处理这个常见的问题,然后当客户端返回请求头中没有session_id时,它的会话会因为cookie而被恢复。0.05%的失败客户端是具有以下一种(或多种)的客户端:

1.禁用Cookie(更常见)
1.在HTTP/HTTPS之间切换时不保留来自同一网站的Cookie的浏览器(更罕见)
可能的解决方案:
1.初始化HTTPS上的cookie开始(即首先检查用户是否在HTTP上,然后将其重定向到HTTPS,然后初始化会话,然后将其重定向到oauth端点)-我个人推荐这样做。
1.一些oauth提供者在用户完成身份验证时会使用url参数来重定向用户。您可以使用这个方法并将其会话ID作为参数发送。-我不建议这样做,因为这样可能会将客户端的会话ID暴露给攻击者。
祝你好运!

qnakjoqk

qnakjoqk2#

我想CBroe是在钱上。我以前也遇到过这种情况(不是特别用OAuth,而是用其他设置会话cookie的重定向)。
更多信息,请访问:Losing session variables after redirect

cwtwac6a

cwtwac6a3#

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

uxhixvfz

uxhixvfz4#

我发现在重定向URL后,将127.0.0.1:8000更改为localhost:8000,由于此会话丢失。测试一下,将localhost:8000更改为127.0.0.1:8000,您将获得此会话。

mdfafbf1

mdfafbf15#

在所有控制器的开头写上:

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

我不知道为什么,但我自己也遇到过同样的问题。我发现当在CakePHP中使用OAuth重定向时,会话ID不知何故丢失了。上面这行代码确保了会话ID总是存在的。希望这能有所帮助。

相关问题