在laravel中重定向到外部url时如何保留会话数据
Posted
技术标签:
【中文标题】在laravel中重定向到外部url时如何保留会话数据【英文标题】:how to keep session data when redirect to external url in laravel 【发布时间】:2020-09-24 17:26:24 【问题描述】:我是 php 新手。我在不同的服务器上有一个 laravel api 和 laravel webui。当我在 webui 中发出登录请求时,将其发送到 api,如果结果成功,则将 laravel/passport 令牌返回给 webui。我将令牌存储在会话中(在 webui 身份验证控制器中)。
AuthController;
Session::put('token', $value['token']);
我的 CustomAuth 中间件;
class CustomAuth extends Middleware
public function handle($request, Closure $next, $guard = null)
if (Session::has('token'))
return $next($request);
else
return response(view('pages.unauthorized'));
付款方式;
return redirect()->away($redirectUrl);
然后,当付款成功/失败时,wirecard 返回到我的网站(callbackUrl)。在本节中,会话数据丢失,用户重定向到登录页面。我不确定我在 auth 部分是错的还是错误地使用了会话。我可以在重定向时存储会话数据吗?或者我该如何更改身份验证部分?
注意:成功和失败路由必须在 auth 中间件中。还有我在 web 中间件组中的所有路由。在 app/Http/Kernel.php 中,在 'web' 中添加了这一行
\Illuminate\Session\Middleware\StartSession::class,
【问题讨论】:
【参考方案1】:理想情况下,当您构建 API 时,我们不使用 web
中间件组,而是使用 api
中间件组。因此,如果您的所有路由都在api.php
(它们应该在这里),那么会话没有被激活或者它不会工作,因为您在这里使用api
中间件组和api
守卫。
另一件事是,您已经使用passport
生成了一个令牌,因此您不需要将令牌存储在session
中。这就是 Json Web Token 的奇妙之处。当您的 WebUI 将令牌传递回后端时,它可以被解析。后端/API 只需查看它并查看令牌是否经过身份验证,在处理令牌时无需检查会话或类似的东西。为此,您的 api 路由必须通过 auth:api
中间件。
最后,您必须确保 WebUI 以正确的形式发回令牌(例如 Bearer 标头、基本身份验证等)。
祝你好运!
【讨论】:
您好,首先感谢您的回答。我的 webui 在 web 中间件中路由而不是在 API 中。而且我不在 API 中使用会话,我将令牌存储在 webui 中。但是当我重定向到外部支付页面然后返回我的网站时,会话数据会丢失。不仅是令牌,我还在会话中存储购物车。我失去了一切。【参考方案2】:一种可能的解决方案: 使用付款回调时,您应该始终记住包括 https、http、www 和 none-www 在内的地址的会话数据是不同的。 您应该始终强制(www 或 none-www)和(https 或 http)。通过这种方式,您始终可以确保用户将始终返回到存储用户会话数据的地址。
根据您使用的网络服务器,执行此操作的方法会有所不同。
例如,如果您使用的是 apache,则可以在 htaccess 中使用以下配置:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# remove wwww.
RewriteCond %HTTP_HOST ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%REQUEST_URI [R=301,QSA,NC,L]
# redirect to https
RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R=301,QSA,L]
# Handle Authorization Header
RewriteCond %HTTP:Authorization .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_URI (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ index.php [L]
</IfModule>
【讨论】:
你说的是,如果会话数据是example.com,然后回调url它必须是example.com格式。因为用户的会话数据存储在这个 url 中。我对吗?如果我做对了,这行不通。我检查了这个,结果还是一样以上是关于在laravel中重定向到外部url时如何保留会话数据的主要内容,如果未能解决你的问题,请参考以下文章