php - 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。
解决方案
由于 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);
}
这可能不是最优雅的方式,但它适用于您提到的所有提供者。
推荐阅读
- freeradius - Tmp-String-0 的基本使用
- c# - 如何在c#中使用datatable parent和child将数据库中的数据节点到treeveiw
- angular - Angular 服务器端从存储库和自定义组件动态呈现 html 模板
- java - 在 JAVA 中使用 flatMap 和 Observable
- amazon-elastic-beanstalk - Amazon Elastic Beanstalk 配置 – 非内置 php.ini 配置
- express - 我似乎无法在 nativescript 角度响应中的快速后端的响应中找到我的标头
- pandas - 如何使用查询功能选择两列的总和
- r - 将保存为网页的 Excel 文件导入 R
- angular - 使用多个参数路由到同一个组件
- python - python、zipfile、文件更新:存储在 ZIP 存档中的多个版本