【问题标题】:how to keep session data when redirect to external url in laravel在laravel中重定向到外部url时如何保留会话数据
【发布时间】: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,

【问题讨论】:

    标签: php laravel authentication session laravel-passport


    【解决方案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 中。我对吗?如果我做对了,这行不通。我检查了这个,结果还是一样
    猜你喜欢
    • 2020-08-06
    • 2016-08-27
    • 2016-03-30
    • 2020-07-16
    • 2014-08-17
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多