在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时如何保留会话数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中重定向到外部 URL?

在 Laravel 4 中重定向回时保留表单值

如何在java中重定向到外部URL

重定向到新的外部 url 时如何保留 localStorage [重复]

单击时如何在新选项卡或(新窗口)中重定向超链接?

如何在 laravel jetstream 中重定向?