我在同一Laravel项目中有一个React SPA。登录/注册/注销和所有其他js视图位于js文件夹中,并对所有POST/GET
请求使用axios api调用。我想对嵌入式SPA使用默认的基于Laravel会话的Web身份验证,因为它位于同一项目文件夹中,并且将是 only 的javascript客户端访问它。此api无需向公众开放,仅适用于此react应用,它是SPA的代表,它具有速度和良好的用户体验,而无需重新加载整个页面。
我以前尝试过使用Passport,而且一个多月以来,我仍然无法使其按预期工作。我不想处理令牌,访问令牌,刷新令牌,吊销令牌,CSRF等。只是开箱即用的基于Laravel会话的简单身份验证,在Web上如此轻松地工作,但是希望它在我的react应用程序上工作。唯一的刀片文件是index.blade.php
,其中包含反应app.js
有什么想法我们可以做到吗?
更新1:
实施@ceejayoz的建议后:
您必须在其中添加各种Session / Cookie中间件 app / Http / Kernel.php(类似 \ Illuminate \ Session \ Middleware \ StartSession :: class)到API路由。
我添加到$middlewareGroups.api
中以匹配web
中的app/Http/Kernel.php
中间件:
'api' => [
'throttle:60,1',
'bindings',
// Newly added middleware to match web middleware
\App\Http\Middleware\EncryptCookies::class
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
我意识到发生了两个问题:
sessions
表中。用户登录后,不应该仅将新的单个会话插入该表吗?用户登录后,在浏览器中手动刷新页面并调用受保护的路由时,我得到一个401 Unauthenticated
,它在Illuminate/Auth/GuardHelpers.php
中指向该方法:
public function authenticate() {
if (! is_null($user = $this->user())) {
return $user;
}
throw new AuthenticationException; // throws this 401 exception on logged in page refresh when fetching data from private route
}
一些附加说明:
config/auth.php
中,我将guards.api.driver
更改为session
,而不是token
。routes/api.php
中,我将受保护的路由包装在auth中间件中,如下所示:Route::group(['middleware' => 'auth'], function() { PRIVATE ROUTES HERE }
config/session.php
中,我有'domain' => '.mydomain.com'
我将每个axios api请求发送回这些标头,如下所示:
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
let token = document.head.querySelector('meta[name="csrf-token"]');
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
您知道如何解决这两个问题吗?
答案 0 :(得分:1)
这是可行的(我对某些应用也做了同样的事情。)
默认情况下,routes/api.php
中的路由没有可用的会话,但是您可以将app/Http/Kernel.php
中的各种Session / Cookie中间件(类似\Illuminate\Session\Middleware\StartSession::class
的东西)添加到API路由中
您也可以按照@ljubadr的建议,将API路由直接放在routes/web.php
中,尽管这可能意味着您需要进行其他更改(例如从网络路由中删除CSRF保护)。
答案 1 :(得分:1)
好像您的会话不是持久的。
检查是否更改了config/session.php
中可能会引起问题的任何值。
您可以检查默认的Sesion配置值here
通过评论,@ Wonka通过更改解决了他的问题
'same_site' => 'strict'
到
'same_site' => null