首页 > 解决方案 > Laravel 7 - 使用 Apple 登录会导致会话被多次覆盖

问题描述

本质上,我正在开发一个允许用户从多个提供商登录的应用程序:Facebook、Twitter 和 Apple。当用户访问受 auth 保护的路由时,他会被重定向到登录屏幕。此时,我通过在 RedirectIfAuthenticated.php 中执行以下操作来保存预期的路由:

...
$url = redirect()->intended()->getTargetUrl();
if(!Session::has('redirect') || (Session::get('redirect') === 'https://example.com')) {
   Session::put('redirect', $url);
}
...

我也尝试过以下方法:

...
$url = redirect()->intended()->getTargetUrl();
if((!Session::has('redirect') || Session::get('redirect') === 'https://example.com') && $url !== 'https://example.com') {
    Session::put('redirect', $url);
}
...

但是,这会导致以下错误:

Argument 1 passed to Symfony\Component\HttpFoundation\Response::setContent() must be of the type string or null, object given, called in ../framework/src/Illuminate/Http/Response.php on line 65

上面错误的第65行是:

return $next($request); 

如您所见,我将预期的 URL 保存到会话中,这对于 Facebook 和 Twitter 等提供商的 GET 请求非常有效,但是,由于 Apple 需要对数据进行 POST 请求,我注意到我的会话通过查看被覆盖了好几次日志输出,例如

[2020-07-28 17:53:02] debug.INFO: URL: ($url) https://example.com <-- Incorrect Value
[2020-07-28 17:53:05] debug.INFO: URL: ($url) https://example.com/redirect?route_params <-- Correct Value
[2020-07-28 17:53:07] debug.INFO: URL: ($url) https://example.com <-- Incorrect Value

我试图通过 Cookies 和 Locking Cache 来处理这个问题,但无济于事。我处理会话和/或重定向的方式有问题吗?

最好的,J。

标签: phplaravel

解决方案


由于 Apple 登录的工作方式,会话在用户登录之前被擦除。因此重定向无法与会话一起使用。

我使用cookie解决了它。

在最初的请求中,我会获取预期的 url,并将其存储在 cookie 中,确保您设置了生命周期,这样它就不会在会话中被擦除。

$url = redirect()->intended()->getTargetUrl();
$urlBase = url()->to('/');

if(($url != $urlBase) && ($url != $urlBase . '/login') && (substr($url, 0, strlen($urlBase)) === $urlBase)) {
    Cookie::queue('redirect', $url, 1);
}

然后让整个身份验证生命周期完成,让它重定向到你的主路由。在所述路由的控制器方法中,我检查 cookie 是否存在,如果存在,我将用户重定向到该 url。

if (Cookie::has('redirect')) {
    redirect = Cookie::get('redirect');
    Cookie::queue(Cookie::forget('redirect'));

    return redirect($redirect);
}

这可能不是最优雅的方式,但它适用于您提到的所有提供者。


推荐阅读