我是PHP新手。我在不同的服务器上有一个laravel api和laravel webui。当我在webui中提出登录请求时,我把它发送到api,如果结果是成功的,就返回laravelpassport令牌给webui。我把token存储在session(webui auth控制器)中。
AuthController;
Session::put('token', $value['token']);
我的CustomAuth Middleware;
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);
然后,当支付成功fail wirecard返回到我的网站(callbackUrl)。在这部分,会话数据丢失,用户重定向到登录页面。我不知道是我的auth部分出错了还是session使用不正确。我可以在重定向时存储会话数据吗?或者说,我怎么才能改变auth部分?
注意:成功和失败的路由必须在 auth 中间件中。而我的所有路由都在web中间件组中。在appHttpKernel.php中,在'web'中添加了这行。
\Illuminate\Session\Middleware\StartSession::class,
理想情况下, 当你在构建一个API时, 我们不需要使用 web
中间件组但 api
中间件组。因此,如果您的所有路由都在 api.php
(它们应该在这里),那么这个会话就没有被激活,或者它不能工作,因为你使用的是 api
中间件组和 api
守护在这里。
还有一点,你已经在使用 passport
所以你不需要将令牌存储在 session
. 这就是Json Web Token的厉害之处。它可以被解析,当你的 WebUI 将token传回后台。后台API只需查看它并查看token是否经过验证,当你处理token时,不需要检查session或类似的东西。要做到这一点,你必须通过 auth:api
中间件的api路由。
最后,你必须确保在你的中间件中的 WebUI 正在以正确的形式发送回令牌(例如:Bearer header,基本的auth等)。
祝您好运
一个可能的解决方案。当使用回调支付时,您应该始终记住,包括https、http、www和none-www在内的地址的会话数据是不同的。你应该总是强制使用(www或none-www)和(https或http),这样你就可以确保用户总是回到存储用户会话数据的地址。
根据你所使用的web服务器,做这个的方法将是不同的。
例如,如果你使用的是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>